|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
如注释
- #include<stdio.h>
- int A[4] = {4,3,2,1};
- void QX(int *p)
- {
-
- printf("*p = %d\n",*p);//打印指针p指向的数组第一个元素
- printf("A的地址%d\n",A);
- printf("P的值%d\n",p);//此时P的值为main函数里数组b的地址
- int **pp = &p;//定义一个指向指针的指针 这个指针指向p
- *pp = A;//这个语句表示 pp指针指向的p指针的值修改为A的地址
- //因为之前p的值数组是b的地址 现在改为数组A的地址
- printf("*p = %d\n",*p);//那么这里打印的是A数组第一个元素
-
- printf("A的地址%d\n",A);
- printf("P的值%d\n",p);
-
- }
- int main(void)
- {
- int b[4] = {1,2,3,4};
- int *p = b;
-
- QX(p);//传递指针p进去
- printf("*p = %d\n",*p); //从QX函数从来并未改变指针p的值 也就是说p的指向没有改变
- //为什么我用一个二级指针去尝试改变指针p却做不到呢?
-
- return 0;
- }
复制代码
问题分析:
在你的代码中,你尝试使用一个二级指针来改变指针 p 的值,但是发现 p 并没有被改变。让我们逐步分析一下原因:
1. 在函数 QX 内部,你定义了一个指向指针的指针 pp,并将其初始化为 &p,即 pp 指向了指针 p 的地址。
2. 接着,你尝试将 *pp 的值修改为数组 A 的地址,即 *pp = A;。由于 pp 指向了 p 的地址,这个赋值操作实际上将指针 p 的值修改为了数组 A 的地址。
3. 然后,你打印了 *p,这里输出的是数组 A 的第一个元素。这是因为前面已经将指针 p 的值修改为了数组 A 的地址。
4. 但是,在函数 main 中,当你再次打印 *p 时,你发现 p 的指向并没有改变。这是因为在函数 QX 内部,你改变的是 p 的值(也就是指针的内容),而不是 p 本身。所以在函数 main 中, p 的指向没有发生变化。
解决方案:
如果你想要在函数 QX 中改变指针 p 的指向,你可以将指针的地址传递给函数 QX,然后通过修改指针的地址来改变指针的指向。这样做可以实现指针的指向的改变。
以下是修改后的代码示例:
- #include <stdio.h>
- int A[4] = {4, 3, 2, 1};
- void QX(int **pp) {
- printf("*pp = %d\n", **pp); // 打印指针pp所指向的地址的值,即指针p所指向数组的第一个元素
- printf("A的地址 %p\n", A); // 打印数组A的地址
- printf("P的值 %p\n", *pp); // 此时P的值为main函数里指针p的地址
- *pp = A; // 修改指针p的指向为数组A的地址
- printf("*pp = %d\n", **pp); // 打印被修改后的指针p所指向的地址的值,即数组A的第一个元素
- printf("A的地址 %p\n", A); // 打印数组A的地址
- printf("P的值 %p\n", *pp); // 打印修改后的指针p的值
- }
- int main(void) {
- int b[4] = {1, 2, 3, 4};
- int *p = b;
- QX(&p); // 传递指针p的地址给函数QX
- printf("*p = %d\n", *p); // 打印指针p所指向的地址的值
- return 0;
- }
复制代码
经过以上修改,你会发现指针 p 的指向成功地被改变为数组 A 的首地址。
希望以上解答能够解决你的问题。如果还有疑问,请随时提问。
如果回答对你有帮助,请给我一个最佳答案! 
|
|