黑马程序员技术交流社区

标题: C指针问题 [打印本页]

作者: 2的狠正经    时间: 2014-4-25 18:22
标题: C指针问题
int *p[5]
int (*p)[5]
他们各表示的是什么
作者: 魅影穿眸    时间: 2014-4-25 18:38
int (*p)[M]定义的数组指针,表示定义一个指针变量,此指针变量是指向一个含有M个元素的一维数组:举例:
int a[]={1,2,3,4,5},(*p)[5];p=a;那么指针p就指向数组a的首地址,*(p+i)表示数组a中的值。

nt *p[M]表示声明指针数组p,其指向含有M个指针元素的首地址。举例:
int a[3][2]={1,2,3,4,5,6},*p[4];
p[0]=a[0],p[1]=a[1],p[2]=a[2]
注意int *p[M] 中的M一定要和a[n][k]中的行数和列数即n和k没有任何关系!!!
作者: gmadong@163.com    时间: 2014-4-25 19:39

int (*p)[5] 就是指向一个int的数组的头指针的指针
用法:
int main(int argc, const char * argv[])
{

    *(&p)=1;
    *(&p+1)=2;
    *(&p+2)=3;    *(&p+3)=4;
    *(&p+4)=5;
    printf("%d\n",*(&p));
   printf("%d\n",*(&p+1));
   printf("%d\n",*(&p+2));
printf("%d\n",*(&p+3));
printf("%d\n",*(&p+4));
}
而 int* p[5]这个就不多说了就是一个装int类型的指针的数组

作者: 251638256    时间: 2014-4-25 20:02
int *p[5]
int (*p)[5]
这个问题是我在群里问的吧 写了一些实验数据 也算明白了些 我来说下是怎么回事吧

由于[]符号优先级比*运算符优先级高 所以第一个定义是5个元素的数组是int指针类型,也就是指针数组,其中欧5个元素

第二个由于加了括号改变了优先级 所以第二个是一个Int指针指向了5个数组元素的指针

第二个定义在Codeblocks上实验没有什么作用,因为虽然声明了是指向有5个元素的指针 .但是实际上可以指向任意相同类型的数组.与普通指针不同的是 其偏移量并不是数据类型的字节数 ,而是数据类型的字节数*数组元素数量

    int (*p)[3];
    printf("%d\n", sizeof(p[0]));           //sizeof(int) * 3 等于 12
    printf("%d\n", sizeof((*p)[0]));        //sizeof(int)    等于  4

可以看出 这个数据本身是12个字节
而它指向的数据是一个Int元素 是4个字节

区别就这 , 有什么实际用处我也不知
作者: gaoxinglei123    时间: 2014-4-25 20:16
第一个是一个数组有5个元素,每个元素都是一个整型的指针变量。第二个叫数组指针。是一个指针指向有五个元素的数组




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2