在c语言中,我们需要创建变量(也就是向内存申请空间),为了得到变量的地址,我们需要用到&,也就是取地址操作符。我们通过&得到的地址是一个数值,这个数值有时候也需要存储起来,以便后期的使用。这时候就需要一个指针变量将地址值存储起来。
一、解引用操作符 *
我们来看下面这个代码:
int a=10;
int *p=&a;
在上面这个代码中,定义了一个整型变量a,又定义了一个指针变量p指向a。其中,*代表p是指针变量,int代表p指向的是整型变量,在这里也就是a。
同样,如果定义一个字符型变量,该如何书写呢?
char c='w';
char *pa=&c;
二、指针变量的大小
在32位平台下地址是32bit位,指针变量大小是4个字节
在64位平台下地址是64bit位,指针变量大小是8个字节
三、野指针
概念:野指针就是指针指向的内容是不可知的,是随机的
野指针的成因:
1.指针未初始化
int *p;//局部指针未初始化,默认为随机值
*p=20;
2.指针越界访问
int a[10];
int *p=&a[0];
for(int i=0;i<=11;i++)
{
//当指针指向的范围超过数组范围时,p就是野指针
*(p++)=i;
}
3.指针指向的空间释放
四、传值调用和传址调用
这里讲解一个初学者经常搞错、无法理解的代码
写一个函数,交换两个变量的值
通过这个代码我们发现,a和b的值没有发生交换。这是为什么呢?
在main函数内部,建立了a和b变量。在调用swap函数时,将a和b传递给swap函数,在swap函数中建立形参x和y来接收a和b的值。但是本质上,x和y是独立的空间,a和x的地址时不一样的,b和y的地址是不一样的。在swap函数内部交换x和y,并没有影响到a和b。回到main函数中,a和b自然没有交换。这种调用函数方式为传值调用。
那我们该怎么办呢?
这时候,我们就可以使用指针,将main函数中a和b的地址传递给swap函数,通过地址间接操作main函数中的a和b,就可以达到交换的目的。
如图所示,a和b的值就交换完成了。这种调用函数方式叫传址调用。
结论:当实参传递给形参时,形参会单独创建一份临时空间来接受实参,对形参的修改并不影响实参。我们需要让函数和主调函数真正的建立联系,在函数内部可以修改主调函数中的变量。
所以,以后如果在函数中只需要主调函数中的变量值来进行计算,就可以采用传值调用。如果函数内部需要修改主调函数中变量的值,就可以使用传址调用。
标签:函数,int,指针,地址,swap,真的,变量 From: https://blog.csdn.net/2302_79779170/article/details/136636490