问题描述
- C语言指针移动后指向问题
-
void change _ prt();
main()
{
int * prt,b[3] = {1,2,3};
prt = b;
change _ prt(prt);
printf("%dn", * prt);
}
void change _ prt(p)
int * p;
{ p+=2;
}
为什么结果是1,而不是3?
谢谢。
解决方案
你这代码一堆错误,能编译通过?
void change_prt(int ** p);
int main()
{
int *prt,b[3] = {1,2,3};
prt = b;
change_prt(&prt);
printf("%dn", * prt);
return 0;
}
void change_prt(int **p)
{
p+=2;
}
至于结果为什么不是3
指针可以通过修改它指向的内容
但是你这里是修改指针本身的值(如32位机子下,指针是32位的地址,你只是修改了地址值而不是该指针指向的内存)
在这里来说指针值只是个值传递,会拷贝临时变量的,所以对参数p来说,p的值没有改变
但是
void change _ prt(int * p)
int * p;
{
*p = 10; // p的值也是没有改变的,只是改变了它指向的内存,以前的内存值1,现在是10
}
我修改后的代码,就是把该b头元素地址也昨晚一个指针。
就比如,你有一个文件F,在其他地方生成一个快捷方式S1,你用S1打开文件修改内容并保存,
在原始文件列表再打开F,看到的是修改后的内容
现在的参数就相当于这个快捷方式S1传进去,生成一个临时变量S2,你在其中修改S2指向的路径,那跟S1完全没有关系
(S1快捷方式还是指向你的文件F)
不知道是否明白。
修改后的代码,就是再F,S1,在加一个快捷方式SS1指向S1...
解决方案二:
全局变量和局部变量同名。在局部变量的作用域内,全局变量不起作用
解决方案三:
不要用同名,你改变的不是参数p
解决方案四:
p[0]+=2; 出来的就是3了
解决方案五:
建议楼主 去看下 参数传递方式 值传递和地址传递的真正意思 在看下二级指针 这个问题就明白
时间: 2024-10-30 22:08:29