jpm*_*los 9 c pointers declaration
人.
我试图理解这三个声明之间的差异:
char p[5];
char *p[5];
char (*p)[5];
Run Code Online (Sandbox Code Playgroud)
我试图通过做一些测试来找到它,因为阅读声明和类似的东西的每个指南到目前为止都没有帮助我.我写了这个小程序并且它不起作用(我已经尝试了其他类型的第三个声明的使用,我已经用完了选项):
#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 = %s\np2[0] = %s\np3[0] = %s\n", p1, p2[0], p3[0]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
第一个和第二个工作没问题,我已经明白他们做了什么.第三个声明的含义是什么,使用它的正确方法是什么?
谢谢!
Bla*_*iev 13
第三个是指向 5个字符数组的指针,而第二个是指向char的5个指针的数组.
想象一下这样:
________ _____________________
|0x7777| -------> | H | e | l | l | o |
|______| |_0_|_1_|_2_|_3_|_4_|
p ^
|
0x7777
Run Code Online (Sandbox Code Playgroud)
而第二个看起来像那样:
"abc" "def" "ghi" "jkl" "mno"
^ ^ ^ ^ ^
| | | | |
____________________________________
|0x9999|0x7777|0x3333|0x2222|0x6666|
|___0__|___1__|___2__|___3__|___4__|
p
Run Code Online (Sandbox Code Playgroud)
这是了解指针和数组之间差异的关键之一.数组是一个对象,其大小是每个元素的大小乘以计数,而指针只是一个地址.
在第二种情况下,sizeof(p)
将屈服5 * the_size_of_a_pointer
.
在第三种情况下,sizeof(p)
将产生the_size_of_a_pointer
,通常4
或8
取决于目标机器.
归档时间: |
|
查看次数: |
6067 次 |
最近记录: |