【C深入】指针基础
#include <stdio.h>
int main()
{
int i = 5;
int* p = &i;
printf("%d, %08X\n", i, p);
*p = 10; //等价于i = 10;
printf("%d, %08X\n", i, p);
return 0;
}
运行输出:
i的值变了,但是p的值没有改变,虽然说变量是一段存储空间的别名,但是不见得必须使用这样的别名才能访问和修改这一段空间,通过指针就可以做到这一点
指针本质:
本质上也是一个变量
需要占用一定的内存空间
用于保存内存地址的值
int* pi; int* pc; long* pl; double* pd;
sizeof(pi) = sizeof(pc) = sizeof(pl) = sizeof(pd) = 4
在32位系统上地址总线32位,所以32位PC机上指针总是占用4个字节
所以不同类型的指针占用的内存空间大小相同。
*号的意义
在指针申明时,*表示所申明的变量为指针
在指针使用时,*表示取指针所指向的内存空间的值,可以通过指针修改内存中的任意地址内容
还表示乘号
传值调用与传址调用
指针是变量,因此可以申明为指针参数
当一个函数体内部需要改变实参的值,则需要使用指针参数
函数调用时实参将复制到形参
传址调用可以改变函数外部的值,就是通过指针,通过防盗门钥匙*来改变的。
指针适用于复杂数据类型作为参数的函数中,提高效率
struct Test
{
int a[10000];
int b[10000];
}
void f(struct Test t)
{
}
int main()
{
struct Test tt;
f(tt); //利用传值调用f,struct Test tt玩玩全全复制80000字节到f中,会很耗时,效率降低
return 0;
}
如果改为
void f(struct Test* t)
{
}
int main()
{
struct Test tt;
f(&tt); //利用传址调用f,只需要复制4字节到f中,跟上面效率相差20000倍,
return 0;
}
交换函数
void swap(int a, int b) //交换失败,因为是传值调用,不会对外部变量产生影响
{
int t = a;
a = b;
b = t;
}
改为:
void swap(int* a, int* b) //交换成功,因为是传址调用
{
int t = *a;
*a = *b;
*b = t;
}