萨西摩尔·槿花 发表于 2022-10-11 18:49:39

关于指针的几个小问题

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:}

陈尚涵 发表于 2022-10-11 18:59:08

a是一个值
&a是一个地址
p1是一个指针,用来存地址
*p1是一个值,用来存地址
显然&a是一个地址,*p1是一个值,根本不对应
p1存的是地址,和&a对应

萨西摩尔·槿花 发表于 2022-10-11 19:03:29

陈尚涵 发表于 2022-10-11 18:59
a是一个值
&a是一个地址
p1是一个指针,用来存地址


谢谢,所以(*P1)等价于a吗

jackz007 发表于 2022-10-11 19:03:47

本帖最后由 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:08:52

本帖最后由 陈尚涵 于 2022-10-11 20:11 编辑

萨西摩尔·槿花 发表于 2022-10-11 19:03
谢谢,所以(*P1)等价于a吗

并不是,数组本身都是指针,赋值是应该改成p=a;可以直接p

jhq999 发表于 2022-10-11 20:19:56

内存泄漏

陈尚涵 发表于 2022-10-11 20:23:54

jhq999 发表于 2022-10-11 20:19
内存泄漏

jhq999 发表于 2022-10-11 20:31:25

陈尚涵 发表于 2022-10-11 20:23


指针p未赋初值的野指针,可能是任意值,再给这个野指针指向的内存赋值,不是内存泄漏吗?

陈尚涵 发表于 2022-10-11 20:56:05

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

jhq999 发表于 2022-10-11 21:00:24

陈尚涵 发表于 2022-10-11 20:56
你前半句没问题 但是内存泄露的定义自己看https://baike.baidu.com/item/%E5%86%85%E5%AD%98%E6%B3%84%E6 ...

学习了,未学透

陈尚涵 发表于 2022-10-11 21:05:03

jhq999 发表于 2022-10-11 21:00
学习了,未学透

搞的我还以为自己错了{:10_245:}

jhq999 发表于 2022-10-11 21:12:57

陈尚涵 发表于 2022-10-11 21:05
搞的我还以为自己错了

应该是可能导致未可知后果,其中包括内存泄漏,如果覆盖的是储存申请内存的唯一保存的指针的话

陈尚涵 发表于 2022-10-11 21:19:27

jhq999 发表于 2022-10-11 21:12
应该是可能导致未可知后果,其中包括内存泄漏,如果覆盖的是储存申请内存的唯一保存的指针的话

这种就是结果不理想,不至于产生这种后果吧
页: [1]
查看完整版本: 关于指针的几个小问题