A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 2的狠正经 中级黑马   /  2014-4-25 18:22  /  1311 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

int *p[5]
int (*p)[5]
他们各表示的是什么

4 个回复

倒序浏览
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没有任何关系!!!

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报

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类型的指针的数组

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
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个字节

区别就这 , 有什么实际用处我也不知

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
gaoxinglei123 来自手机 中级黑马 2014-4-25 20:16:12
报纸
第一个是一个数组有5个元素,每个元素都是一个整型的指针变量。第二个叫数组指针。是一个指针指向有五个元素的数组
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马