大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
首先查看一下时否是final的,如果是final的你改变这个值会报错
创新互联成立与2013年,是专业互联网技术服务公司,拥有项目做网站、成都网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元周至做网站,已为上家服务,为周至各地企业和个人服务,联系电话:18980820575
其次,看一下是否是static修饰的.如果不是,查看其它地方是否有局部变量叫了一样的名字
最后,就是查看你的代码是否有对该全局变量进行了值得修改.
#includestdio.h
void swap(int *a,int *b)
{
int t=0;
t=*a;
*a=*b;
*b=t;
}
int main()
{
int x=3,y=5;
int *p=x,*q=y;
swap(p,q);
printf("%d %d\n",*p,*q);
printf("%d %d\n,a,b); //看看是不是 a,b也改变了!~!
}
你那个错误,我的估计: 你可以用vc++单步调式一下.也可以完全理解的.
p=x 就是把 x的地址保存在 指针 p中. *p 就是得到 值. *p=3.
q也差不多.
你下面 sqap(p,q) . 就是把地址传过去了.
可是传回来的值没有改变,为什么呢!
原因很简单.
因为你的
int *t;
int*t;
t=a;a=b;b=t;
交换的是 a和b 的地址.
不要忘记了,当调用一个函数时.
os会为 swap 函数中的 int *a,int *b.开辟内存.
你改变的是swap开辟的内存.并没有改变 main中的*p和*q内存区域.
我再说清楚点.
p 保存的是 a q保存的是 b
swap函数 a 保存的也是 a b保存的也是b
你用交换了 a和b的 地址.有什么用.没有改变原来的地方的地址.
只是改变了你自己的 a 和 b里面的地址. 没有改变那边的 真正的 3 和 5.
如果用了
int t;
t=*a;
*a=*b;
*b=t;
就是间接去改变那边的值.
通过里面 a,b,的地址来找到 真是的 3,5 然后就改变了.
你理解错了
函数里的实质是 实 参 复 制 形 参
你上面s(m)对于函数int s(int x)来说.
函数内部里只是把m的值1传给了x.然后x=2
x的值改变和m有什么关系呢
要想改变m的话可以这么改写函数
int s(int *p)
{
*p=2;
}
void main()
{
int m=1;
s(m);
printf("%d\n",m);
}
区别在于
第二个用的是地址.虽然也是复制形参,
但是他们是复制的是 地 址.
所以这里s(m) 使得 m等于p
m和p都是地址,
那么*p和m指的是同一个地址的值
所以*p=2本质也就是m=2
如果通过函数传参方式调用,并且不是传的指针,那就不会改变原来的值,如果想改变全局变量的值,可以直接在函数中使用,不需要传参。也或者你传指针进去
你对函数调用和参数传递还不是很理解
1.首先函数调用的参数有形参和实参之分
swap(p,q);//p q为实参
void swap(int*a,int*b)//a b为形参
{int*t;
t=a;a=b;b=t;
}
2.指针变量名表示的是变量的值,这个值是其他变量的地址,而不是指针变量本身所在内存空间的地址
如:
int a;//定义整型变量,假设其地址为0xaaaaaaaa
int *p;//定义一个指针变量p,肯定要为其分配内存,假设为0xffffffff,还没初始化,里面的数据是不确定的。
p=a;//p表示的0xffffffff里面的数据,是a的地址,执行后0xffffffff里面的数据变成a的地址,即0xaaaaaaaa
*p=5;//往a里写入数据
3.形参跟实参是不同的变量,占用不同的内存空间
所以a b已经是两个跟p q不同的变量了。
只不过是值跟他们相等罢了。
就如int m,n;
m=n; 你能说m和n是同个变量么?
4.既然形参和实参是不同的变量,
t=a;a=b;b=t;
交换a b的值(交换存储在a b指针变量里的数据,这个数据是地址,变成a跟q指向同一个对象,b q指向同一个对象)不会影响到p q的值
int t;
t=*a;*a=*b;*b=t;//交换a b指针变量里的地址所指向的数据,这样才能交换。
C语言整型、实型数据,如果以变量名称作为参数,系统规定的处理方式就是:实际参数仅决定形式参数的初值,形式参数在子函数内部的操作与实际参数无关。
如果需要子函数内的操作能够影响实际参数的内容,需要使用实际参数变量的地址做参数,使得子函数内部对于形式参数的操作能够直接在实际参数的存储空间内进行。你的子函数定义应该修改为:
int
max(int
*a,int
*b)
{
int
c;
if(*a*b)
{
c=*a;
*a=*b;
*b=c;
}
}
函数的调用格式应该为:
max(m,i);
使用实参地址作为参数,与子函数指针类型的形式参数对应。
达到在子函数中通过实际参数地址,直接操作实际参数变量内容的目的。