关于指针的几个小问题
1.{int *p1;
p1=&a;}
这是书上把a的地址传递给P1的代码,为什么不是
{int *p1;
*p1=&a;}
https://fishc.com.cn/static/image/smiley/ARU/aru-1x-2_064.png
2.
int(*p) 是什么意思
*(*p+j)又是什么?
小白坐等大佬解答{:10_286:} a是一个值
&a是一个地址
p1是一个指针,用来存地址
*p1是一个值,用来存地址
显然&a是一个地址,*p1是一个值,根本不对应
p1存的是地址,和&a对应 陈尚涵 发表于 2022-10-11 18:59
a是一个值
&a是一个地址
p1是一个指针,用来存地址
谢谢,所以(*P1)等价于a吗 本帖最后由 jackz007 于 2022-10-11 20:24 编辑
p1 = & a ; // 为指针 p1 赋值为数组 a 的内存地址
* p1 = & a ; // 为指针 p1 所指向的内存地址赋值为数组 a 的内存地址
1、我们是要把 a 的地址赋值给指针 p1,而不是要赋值给 p1 所指向的内存地址,而且,这个时候,p1 还没有指向有效的内存地址,为* p1 (无效地址) 赋值会直接给程序带来灾难;
2、int(*p) 定义了 p 为指向末维是 4 的二维整型数组的指针,例如,可以把 p 指向 int a ;那么,就可以像使用 a[ i ] 那样通过 p[ i ] 来访问二维数组 a 中的每一个元素。
*(* p + j) 实际上是 *(* (p + 0) + j) 也就是 p
楼主可以考察一下这个代码和运行结果:
#include <stdio.h>
int main(void)
{
int d = {{ 1 ,2 ,3} , \
{11 , 12 , 13} , \
{21 , 22 , 23} , \
{31 , 32 , 33}} ;
int (* p) = d , i , j , k ;
for(i = 0 ; i < 4 ; i ++) {
printf("%2d" , p) ;
for(j = 1 ; j < 3 ; j ++) printf(" , %2d" , p) ;
printf("\n") ;
}
printf("\n") ;
for(i = 0 ; i < 4 ; i ++) {
printf("%2d" , *(* (p + i))) ;
for(j = 1 ; j < 3 ; j ++) printf(" , %2d" , * (* (p + i) + j));
printf("\n") ;
}
}
编译、运行实况:
D:\\C>g++ -o x x.c
D:\\C>x
1 ,2 ,3
11 , 12 , 13
21 , 22 , 23
31 , 32 , 33
1 ,2 ,3
11 , 12 , 13
21 , 22 , 23
31 , 32 , 33
D:\\C> 本帖最后由 陈尚涵 于 2022-10-11 20:11 编辑
萨西摩尔·槿花 发表于 2022-10-11 19:03
谢谢,所以(*P1)等价于a吗
并不是,数组本身都是指针,赋值是应该改成p=a;可以直接p 内存泄漏 jhq999 发表于 2022-10-11 20:19
内存泄漏
? 陈尚涵 发表于 2022-10-11 20:23
?
指针p未赋初值的野指针,可能是任意值,再给这个野指针指向的内存赋值,不是内存泄漏吗? jhq999 发表于 2022-10-11 20:31
指针p未赋初值的野指针,可能是任意值,再给这个野指针指向的内存赋值,不是内存泄漏吗?
你前半句没问题 但是内存泄露的定义自己看https://baike.baidu.com/item/%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F/6181425 陈尚涵 发表于 2022-10-11 20:56
你前半句没问题 但是内存泄露的定义自己看https://baike.baidu.com/item/%E5%86%85%E5%AD%98%E6%B3%84%E6 ...
学习了,未学透 jhq999 发表于 2022-10-11 21:00
学习了,未学透
搞的我还以为自己错了{:10_245:} 陈尚涵 发表于 2022-10-11 21:05
搞的我还以为自己错了
应该是可能导致未可知后果,其中包括内存泄漏,如果覆盖的是储存申请内存的唯一保存的指针的话 jhq999 发表于 2022-10-11 21:12
应该是可能导致未可知后果,其中包括内存泄漏,如果覆盖的是储存申请内存的唯一保存的指针的话
这种就是结果不理想,不至于产生这种后果吧
页:
[1]