加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

“char(* p)[5]”的含义是什么?

发布时间:2020-12-16 05:54:38 所属栏目:百科 来源:网络整理
导读:人. 我想抓住这三个声明之间的差异: char p[5];char *p[5];char (*p)[5]; 我试图通过做一些测试找到这个,因为阅读声明和这样的东西的每个指南迄今没有帮助我.我写了这个小程序,它不工作(我尝试过其他种类的使用第三个声明,我已经用完了选项): #include std
人.

我想抓住这三个声明之间的差异:

char p[5];
char *p[5];
char (*p)[5];

我试图通过做一些测试找到这个,因为阅读声明和这样的东西的每个指南迄今没有帮助我.我写了这个小程序,它不工作(我尝试过其他种类的使用第三个声明,我已经用完了选项):

#include <stdio.h>                                                              
#include <string.h>                                                             
#include <stdlib.h>                                                             

int main(void) {                                                                
        char p1[5];                                                             
        char *p2[5];                                                            
        char (*p3)[5];                                                          

        strcpy(p1,"dead");                                                     

        p2[0] = (char *) malloc(5 * sizeof(char));                              
        strcpy(p2[0],"beef");                                                  

        p3[0] = (char *) malloc(5 * sizeof(char));                              
        strcpy(p3[0],"char");                                                  

        printf("p1 = %snp2[0] = %snp3[0] = %sn",p1,p2[0],p3[0]);          

        return 0;                                                               
}

第一和第二件作品还好,我已经明白了他们做了什么.第三个声明的含义和正确的使用方法是什么?

谢谢!

解决方法

第三个是一个指向5个字符的数组的指针,而第二个是一个指向char的5个指针的数组.

想像这样:

________          _____________________
|0x7777| -------> | H | e | l | l | o |
|______|          |_0_|_1_|_2_|_3_|_4_|
    p             ^
                  |
                  0x7777

而第二个看起来像这样:

"abc"  "def"  "ghi"  "jkl"  "mno"
    ^      ^      ^      ^      ^
    |      |      |      |      |
____________________________________
|0x9999|0x7777|0x3333|0x2222|0x6666|
|___0__|___1__|___2__|___3__|___4__|
                  p

这是理解指针和数组之间差异至关重要的情况之一.数组是一个对象,其大小是每个元素的大小乘以计数,而指针只是一个地址.

在第二种情况下,sizeof(p)将产生5 * the_size_of_a_pointer.

在第三种情况下,sizeof(p)将产生size_of_a_pointer,通常为4或8,这取决于目标机器.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读