user-0 提问: 求教

回复:
user: user-1
content: test（char *p） {  p = ”555“； } p是地址，是不能被赋值的！ 建议你看一下我曾写过的一篇关于c程序学习的总结博客，上边有关于指针的介绍，并附有程序，希望对你的学习有所帮助！ http://blog.csdn.net/ztzi321/article/details/17024559

user: user-2
content: p记录的是一个地址，是十六进制记录的，不可能被赋值，而*p记录的是这个地址里面的值。

user: user-3
content: 我认为这两函数执行没问题。首先p和p1没有初始化，但是p="555";指是把形参p指向了常量字符串的首地址，这个常量字符串是编译时就开辟了静态内存的，这个改变的是形参的指针值，相当于定义一个局部指针变量p，你初始化为NULL也行，初始化为指向一个常量字符串也行，这不会有任何问题，仅仅是这个test函数不会让实参p改变而已，实参的p还是野指针，相当于没初始化，这个时候去用p才有可能造成错误（如果只是给指针赋初值则不会），如果后面不使用p，仅仅执行test函数，什么问题都不会有，使用才会有问题,比如给*p赋值，则会出问题。test1 函数一样，但改变的是实参p1的指针值指向常量字符串，此时p1指向了常量字符串，使用它则不会有问题。

user: user-4
content: 因为p和p1在调用test和test1函数之前都是野指针，但是p经过调用test后，p还是一个野指针，并没有改变p指向的位置，但是p1经过test1之后，p1就指向了字符串“555”。

user: user-5
content: 我咋感觉2个都没问题呢？ test是传递的指针本身的值，改变的是test局部变量指针本身的值，所以test实际没有改变什么。 test1传递的是二级指针的值，改变的是p1指针本身的值，所以test1会改变p1本身的值。 2个函数都没有动p和p1指向内存的值，为啥会有错误呢。不解ing

user: user-5
content: 引用 7 楼 starytx 的回复:[quote=引用 5 楼 u013431701 的回复:] [quote=引用 1 楼 user-14 的回复:] 因为你改变的只是p1的值 而不是他指向的内存  哦，原来是这样的，没分配内存，不可以赋值，但是可以重新指向其它的内存地址.[/quote]重点不在分配不分配空间的问题，重点是你的p和p1没有初始化，如此一来，第一个test()函数没有出错是因为，你并没有改变实参的内容，而test1()你通过传入实参的地址，改变了实参p1指向的内容的值(但是你的p1没有初始化，他此时指向哪里呢？这是一个未定义行为，也许指向一个其他程序的内存空间，而你传入地址要改变这个空间的数据，故而引起错误)[/quote] test1改变的不是p1本身的值吗？你怎么说是p1指向的内容的值？函数参量是二级指针的呢。

user: user-6
content: 其实电脑开机后物理内存的每个字节都是可读写的，区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-7
content: 这题目写的,理解了好半天才看明白阿 我还以为那段代码运行时已经崩溃了呢  去看指针.

user: user-8
content: 引用 3 楼 ALNG 的回复:sorry, 因为是传值调用，test中改变的p是原来p的一个副本，原来的p始终没变，而且没有初始化，你引用它时可能访问非法内存导致程序失败。  这个才是正解！

user: user-9
content: 7L正解哦~~~

user: user-10
content: 内存非法访问

user: user-11
content: 引用 5 楼 u013431701 的回复:[quote=引用 1 楼 user-14 的回复:] 因为你改变的只是p1的值 而不是他指向的内存  哦，原来是这样的，没分配内存，不可以赋值，但是可以重新指向其它的内存地址.[/quote]重点不在分配不分配空间的问题，重点是你的p和p1没有初始化，如此一来，第一个test()函数没有出错是因为，你并没有改变实参的内容，而test1()你通过传入实参的地址，改变了实参p1指向的内容的值(但是你的p1没有初始化，他此时指向哪里呢？这是一个未定义行为，也许指向一个其他程序的内存空间，而你传入地址要改变这个空间的数据，故而引起错误)

user: user-12
content: 指针没赋值，当然就不能使用了

user: user-5
content: 其实也对，地址变了，内容当然变了。   #include <stdio.h> void test(char * p); void test1(char ** p); int main(void ) {     char *p = "it's cotent of pointer p!";     char *p1= "it's cotent of pointer p1!";      //测试test     printf("before calling test(p), address of p is %p\n", p);     printf("before calling test(p), content of p is %s\n", p);     test(p);     printf("after calling test(p), address of p is %p\n",p);     printf("after calling test(p), content of p is %s\n", p);     //测试test1     printf("-------------\n下面测试test1\n--------------\n");     printf("before calling test1(p), address of p is %p\n", p1);     printf("before calling test1(p), content of p is %s\n", p1);     test1(&p1);     printf("after calling test1(p), address of p is %p\n", p1);     printf("before calling test1(p), content of p is %s\n", p1);      return 0; } void test(char *p) {      printf("Now it's in test function\n");      p = "555"; } void test1(char ** p) {     printf("Now it's in test1 function\n");     *p = "555"; }

user: user-13
content: #include <stdio.h>  void test(const char *p) {      printf("Just so you know, test() has modified a char * at memory location %p\n"            "Please check if it's the pointer you intended to modify!\n", &p);      p="Changed in test!"; }  int main() {      const char* q="Origninal text!";      printf("Address of q is %p\n", &q);      printf("before calling test(q), address contained in q is %p\n", q);      test(q);      printf("after calling test(q), address contained in q is %p\n",q); }

user: user-0
content: 引用 1 楼 user-14 的回复:因为你改变的只是p1的值 而不是他指向的内存  哦，原来是这样的，没分配内存，不可以赋值，但是可以重新指向其它的内存地址.

user: user-0
content: 引用 1 楼 user-14 的回复:因为你改变的只是p1的值 而不是他指向的内存  这样没有分配内存空间，也可以赋值吗？ 这样应该有问题才对啊.

user: user-13
content: sorry, 因为是传值调用，test中改变的p是原来p的一个副本，原来的p始终没变，而且没有初始化，你引用它时可能访问非法内存导致程序失败。

user: user-13
content: 是吗，应该没问题啊？

user: user-14
content: 因为你改变的只是p1的值 而不是他指向的内存