user-0 提问: 关于指针的小问题

回复:
user: user-0
content: 引用 8 楼 hou09tian 的回复:  兄弟，你教会了我方法，膜拜

user: user-1

user: user-0
content: [/quote] 但是pp指向是NULL，即pp变量不能存放数据（不可以读写），*pp = p; **pp还不是要往pp里面写数据。         我的理解是，并不是指向NULL不可以存放数据，向指向NULL的指针赋值，这个指针就会指向要指向的地方，但是不能给没    有 初始化的指针赋值，因为不知道没有赋值的指针指的是什么地方，可能就指向不可读的地方，这样连打印都不可能，别说改了  }[/code] 指针这块理解比较晦涩，但是还是要好好学习一下，因为这是C语言的精髓所在嘛[/quote]  初学，理解有误的话多讨论

user: user-0
content: [/quote] 但是pp指向是NULL，即pp变量不能存放数据（不可以读写），*pp = p; **pp还不是要往pp里面写数据。但是如下是可以的： #include <stdio.h> #include <stdlib.h>  int main() {     int** pp = NULL;     int* p = NULL;      p = (int*)100;    //p也是指向NULL，这个赋值成功     printf("%p\n", p);     pp = (int **)malloc(sizeof(int *));     *pp = p;     printf("%#x\n",*pp);      return 0;  } 指针这块理解比较晦涩，但是还是要好好学习一下，因为这是C语言的精髓所在嘛[/quote]

user: user-2
content: 引用 2 楼 LD_______ 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] #include <stdio.h>  int main() {     int** pp = NULL;    [color=#FF0000] int* p = NULL;   //p也是指向NULL,但是赋值成功了      p = (int*)100;     printf("%p\n", p);     *pp = p;         printf("%x\n",*pp);      return 0;  } 将100赋值给p是没问题的，即p指向内存单元里以100开头的地址； 但是将*pp = p;赋值就是有问题的，因为pp指向NULL，即不可读不可写的地址，*pp = p;就是对其写操作，自然是会出现段错误； 引用 1 楼 cfjtaishan 的回复:#include <stdio.h>  int main() {     int** pp = NULL;     int* p = NULL;          p = (int*)100;    //p也是指向NULL，这个赋值成功     printf("%p\n", p);     *pp = p;         printf("%x\n",*pp);      return 0;  } 将100赋值给p是没问题的，即p指向内存单元里以100开头的地址； 但是将*pp = p;赋值就是有问题的，因为pp指向NULL，即不可读不可写的地址，*pp = p;就是对其写操作，自然是会出现段错误；  我将本来指向0地址的指针指向100，那我也可以将本来指向0的pp指向100，这样好像也说的过去，*pp也就是（int*）类型，将它指向100，应该也是可以的吧，难道是因为*pp没有初始化？  [/quote] 但是pp指向是NULL，即pp变量不能存放数据（不可以读写），*pp = p; **pp还不是要往pp里面写数据。但是如下是可以的： #include <stdio.h> #include <stdlib.h>  int main() {     int** pp = NULL;     int* p = NULL;      p = (int*)100;    //p也是指向NULL，这个赋值成功     printf("%p\n", p);     pp = (int **)malloc(sizeof(int *));     *pp = p;     printf("%#x\n",*pp);      return 0;  } 指针这块理解比较晦涩，但是还是要好好学习一下，因为这是C语言的精髓所在嘛

user: user-0
content: 引用 3 楼 fight_in_dl 的回复:引用指正 p = (int*)100; //为指针变量赋值，将int类型强制转换为int*类型，正确。 p = 100; //赋值运算符两侧类型不匹配，错误。  int** pp = NULL; // *pp是未初始化的空指针，对其进行操作会引发内存访问错误。  对的，我想明白了，就是*PP没初始化。就是想不通为么每次都给我指到无法访问的地方，郁闷 还有，谢谢

user: user-3
content: 引用指正 p = (int*)100; //为指针变量赋值，将int类型强制转换为int*类型，正确。 p = 100; //赋值运算符两侧类型不匹配，错误。  int** pp = NULL; // *pp是未初始化的空指针，对其进行操作会引发内存访问错误。

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:#include <stdio.h>  int main() {     int** pp = NULL;    [color=#FF0000] int* p = NULL;   //p也是指向NULL,但是赋值成功了      p = (int*)100;     printf("%p\n", p);     *pp = p;         printf("%x\n",*pp);      return 0;  } 将100赋值给p是没问题的，即p指向内存单元里以100开头的地址； 但是将*pp = p;赋值就是有问题的，因为pp指向NULL，即不可读不可写的地址，*pp = p;就是对其写操作，自然是会出现段错误； 引用 1 楼 cfjtaishan 的回复:#include <stdio.h>  int main() {     int** pp = NULL;     int* p = NULL;          p = (int*)100;    //p也是指向NULL，这个赋值成功     printf("%p\n", p);     *pp = p;         printf("%x\n",*pp);      return 0;  } 将100赋值给p是没问题的，即p指向内存单元里以100开头的地址； 但是将*pp = p;赋值就是有问题的，因为pp指向NULL，即不可读不可写的地址，*pp = p;就是对其写操作，自然是会出现段错误；  我将本来指向0地址的指针指向100，那我也可以将本来指向0的pp指向100，这样好像也说的过去，*pp也就是（int*）类型，将它指向100，应该也是可以的吧，难道是因为*pp没有初始化？

user: user-2
content: #include <stdio.h>  int main() {     int** pp = NULL;     int* p = NULL;      p = (int*)100;     printf("%p\n", p);     *pp = p;     // pp是不可读不可写的，因为指向NULL了      printf("%x\n",*pp);      return 0;  } 将100赋值给p是没问题的，即p指向内存单元里以100开头的地址； 但是将*pp = p;赋值就是有问题的，因为pp指向NULL，即不可读不可写的地址，*pp = p;就是对其写操作，自然是会出现段错误；