C语言指针问题

如图 这几种指针定义方式有什么区别呢?求大神详细解答每种的区别 满意的话会提高财富值。

首先,你提到的所有p应该是一个类型,也就是
int *p
即,整型指针类型,该类型与一维整型数组等效,即int []
然后一个个来
第一个,只有用在定义的时候才是对的,
int *p=a;意思是定义int*类型的p,初始化为a。等效于int *p;p=a;
第二个,先p+5,然后取值,等效于p[5],在p=a下,也就是a[5],这里其实是越界的,知道是这个意思就好
第三个,先取值,在值加2,p=a时,*p为a[0],这个就是a[0]+2
第四个和第五个类似,如果p=a,那么四五完全等同,都是a[2]的地址
最后一个,对a[5]先取地址再取值,最终还是a[5],这个和第二个是等价的,当然,也一样是越界
温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-12-21
已经定义int a[5];
假如从a[0]到a[4]分别是0、1、2、3、4,注意,没有a[5],它是非法的!
1、*p=a,如果前面有int,即int*p=a;,其作用是定义指针p并指向数组a;如果前面没有int,则这个写法是错误的(不管p是变量还是指针)。
2、*(p+5),如果已经提前定义int*p=a;,则这个式子表示a[5]的值,但前面已经说过,a[5]不存在!所以这个式子是非法的。
3、*p+2,如果已经提前定义int*p=a;,则这个式子表示a[0]的值+2,本例中=0+2=3。
4、p+2,如果已经提前定义int*p=a;,则这个式子表示a[2](元素2)的地址。
5、a+2,a相当于指针,该式子也表示a[2]的地址。
6、*&a[5],它代表a[5]本身,终因a[5]非法,该式子同样非法。
第2个回答  2019-12-04
c语言只能动态分配一块确定大小的内存,使用malloc函数。为了满足你的输入要求,你可以申请一块足以容纳你输入数据的缓存。另外如果非要动态申请的话,你可以一个字节一个字节读取输入的字符,然后动态调用realloc重新分配比之前大1的内存,这样就能实现动态分配。当然这种速度太慢,你可以10个字符10个字符的分配,不够的话就realloc增加10个字节的内存~
第3个回答  2019-12-04
你这个是二维的数组,所以很显然A,B是错的,A,B都是表示一维的。D是表示方法不对。必须像C一样,要不就普通的二维数组表示法。
第4个回答  2020-04-25

30分钟彻底学会C语言指针

相似回答