user-0 提问: 迷惑的双**指针

回复:
user: user-1
content: test(s);还是值传递，只不过这个值刚好是个char *类型的，所以在test函数中只是产生了一个副本，不会对原来的s内容有影响。 test1（&s1）才是真正的地址传递，所以操作s1会导致值改变

user: user-2
content: 引用 1 楼 tnt230 的回复:s传的是指针。而指针是值COPY。所有void test(char *p)中的p是copy了一份s s1传的是指针地址。所有不是值COPY。改变了指针指向。所以结果是对的  恩，有点明白了. 那再追加一个问题，请教你. int **p; int a[10]; p = &a；//提示错误，不能够把 int*[]转换为int **， 这个为什么呢，不都是地址吗？[/quote]  int *[]和int **是不同的类型。 可以：p = &a[0];

user: user-3
content: 引用 8 楼 u013431701 的回复:又发现一个问题，还需请教.  char *p; char *p1;  test(p); test1(&p1);  test（char *p） {  p = ”555“； } test1（char ** p） {  *p = ”555“；  } p和p1都没有动态的分配内存空间，但是p就会导致程序崩溃，而p1就不会，为什么呢？ 我没发现错误，用valgrind查过了。  char *p; char *p1;  int main() {     test(p);     test1(&p1); }  test(char *p) {  p = "555"; } test1(char ** p) {  *p = "555";  }  而且，你这个跟动态内存分配没有关系。你只是往指针变量上赋了一个地址。

user: user-4
content: 引用 楼主 u013431701 的回复:在用到**指针时，有些迷惑的地方.还请大家帮忙解答. 1.我想要把一个字符数组通过参数传递给一个函数，然后在函数中修改该字符数组. 程序如下. void main {  char * s;  char * s1  s = "woshishui";  test(s); test1（&s1） printf("s= %s\n",s); }  void test(char *p) {  char * s = "hahahah";  p = s; } void test1(char **p) {  char * s = "hahahah";  *p = s; } s打印出来的结果是不正确的. s1打印出来的结果是正确的.  有点疑惑. s传就去的是字符数组的首地址，在test函数中通过修改s的指向，不就相当于改变了字符数组s吗？ s1吧地址的地址传进去就可行，更不明白了，地址的地址，哪位高手能形象的说明下，真的很难懂啊. 拜托了. lz char *********************************************s；

user: user-0
content: 又发现一个问题，还需请教.  char *p; char *p1;  test(p); test1(&p1);  test（char *p） {  p = ”555“； } test1（char ** p） {  *p = ”555“；  } p和p1都没有动态的分配内存空间，但是p就会导致程序崩溃，而p1就不会，为什么呢？

user: user-5
content: 引用 5 楼 u013431701 的回复:[quote=引用 1 楼 tnt230 的回复:] s传的是指针。而指针是值COPY。所有void test(char *p)中的p是copy了一份s s1传的是指针地址。所有不是值COPY。改变了指针指向。所以结果是对的  恩，有点明白了. 那再追加一个问题，请教你. int **p; int a[10]; p = &a；//提示错误，不能够把 int*[]转换为int **， 这个为什么呢，不都是地址吗？[/quote]  偷懒下不打字了，http://bbs.csdn.net/topics/370236512

user: user-6
content: //在堆中开辟一个4×5的二维int数组 #include <stdio.h> #include <malloc.h> int **p; int i,j; void main() {     p=(int **)malloc(4*sizeof(int *));     if (NULL==p) return;     for (i=0;i<4;i++) {         p[i]=(int *)malloc(5*sizeof(int));         if (NULL==p[i]) return;     }     for (i=0;i<4;i++) {         for (j=0;j<5;j++) {             p[i][j]=i*5+j;         }     }     for (i=0;i<4;i++) {         for (j=0;j<5;j++) {             printf(" %2d",p[i][j]);         }         printf("\n");     }     for (i=0;i<4;i++) {         free(p[i]);     }     free(p); } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19

user: user-0
content: 引用 1 楼 tnt230 的回复:s传的是指针。而指针是值COPY。所有void test(char *p)中的p是copy了一份s s1传的是指针地址。所有不是值COPY。改变了指针指向。所以结果是对的  恩，有点明白了. 那再追加一个问题，请教你. int **p; int a[10]; p = &a；//提示错误，不能够把 int*[]转换为int **， 这个为什么呢，不都是地址吗？

user: user-0
content: 引用 3 楼 saber_vsgoto 的回复:void test(char *p) {  char * s = "hahahah";  p = s; } void test1(char **p) {  char * s = "hahahah";  *p = s; }   值有test1 是改变了指针的值  test中没有改变 要改变应该 *p="asdfsdf" *p="asdfsdf"这个是编译不过的，字符指针是不能这样赋值的.

user: user-7
content: void test(char *p) {  char * s = "hahahah";  p = s; } void test1(char **p) {  char * s = "hahahah";  *p = s; }   值有test1 是改变了指针的值  test中没有改变 要改变应该 *p="asdfsdf"

user: user-8
content: 转   By-Value:        The value of a variable is sent to function. The actual parameter cannot be changed by function. "In" parameter   By-Reference   An address gets sent to function.                         The function can change the values at that address                         "Out" or "In-Out"   Sending by reference in C requires the use of the pointer symbol (*).               void f (int x)  // x is an integer             {                         x=x+1;             }             void h(int* p_x) // p_x is an address where an integer is stored.             {                         *p_x = *p_x + 1;             }   Can call a by-reference function using the address operator &               int x=9;             f(x) ;   // f cannot change value of x.             h(&x);  // h can change the value of x   Array parameters are similar to Java in effect                           int array[10];                                        void g(int arr[])                         //  put some stuff in it                         // ...                         g (array);                               Trace the following:                void f(int z)             {                         z=z+1;             }             void g(int a[])             {                         a[2]=8;             } void h(int *z) {                         *z = *z+1;             }             void main()             {          int x=6;                         int arr[5]                         for (int i=0;i<5;i++)                                     arr[i]=i;                         f(x);                         g(arr);                         h(&x);                         h(&(arr[4]));             }

user: user-5
content: s传的是指针。而指针是值COPY。所有void test(char *p)中的p是copy了一份s s1传的是指针地址。所有不是值COPY。改变了指针指向。所以结果是对的