变量是存放在内存中的,只要是存放在内存中的二进制数就会有一个内存的地址,所有变量是有地址的!
成都创新互联公司一直秉承“诚信做人,踏实做事”的原则,不欺瞒客户,是我们最起码的底线! 以服务为基础,以质量求生存,以技术求发展,成交一个客户多一个朋友!为您提供成都网站建设、网站制作、成都网页设计、微信平台小程序开发、成都网站开发、成都网站制作、成都软件开发、成都App制作是成都本地专业的网站建设和网站设计公司,等你一起来见证!
那函数是什么呢?函数是由一些运行的语句组成的,程序运行的时候就会把函数中的语句调用到内存中去,那么函数代码在内存中开始的那个内存空间的地址就是函数的地址!
至于函数中用的变量的地址并不是放在代码区的,一般都放在另外的两个地方,其实地址上是有很大的差值的
希望你能理解上面的内容,祝愿你学习C语言能马到成功!
f(a); //调用函数f,q指向a数组的第1个位置即指向a[0]
i=0;[i=0]
i5成立开始循环:(*q)++;q指向的单元自加1,a数组[2,2,3,4,5]
i++;[i=1],i5成立继续循环:(*q)++;q指向的单元自加1,a数组[3,2,3,4,5]
i++;[i=2],i5成立继续循环:(*q)++;q指向的单元自加1,a数组[4,2,3,4,5]
i++;[i=3],i5成立继续循环:(*q)++;q指向的单元自加1,a数组[5,2,3,4,5]
i++;[i=4],i5成立继续循环:(*q)++;q指向的单元自加1,a数组[6,2,3,4,5]
i++;[i=5],i5不成立结束循环
输出a数组
注意q指针的内容一直没变,如果要变需要写成q++;而不是(*q)++;
你对函数调用和参数传递还不是很理解
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指针变量里的地址所指向的数据,这样才能交换。
1、值传递:不管怎么传,原来的实参的值都不会改变。
地址传递,原来的实参的值可能被改变。
打个比方:
值传递就好象你告诉别人你的帐户里有多少钱 帐户里的钱不会改变。
地址传递就好象你告诉别人你的帐户密码 帐户里面的钱可以被改变。
2、例如:
#includestdio.h
point(char *pt)
main()
{char b[4]={'m','n','o','p'},*pt=b;
point(pt);
printf("%c\n",*pt);
}
point(char *p)
{p+=3;
*p='F';}//加上这一句就变了
可以通过函数指针(也就是你说的函数地址)调用,可以这样使用:
#include
int
fun(int
a)
{
printf("a
=
%d\n",
a);
printf("hello
world\n");
}
int
main()
{
int
(*pFun)(int
a);
pFun
=
fun;
(*pFun)(123);
return
0;
}
输出结果:
123
hello
world