本文共 3422 字,大约阅读时间需要 11 分钟。
什么是地址
生活中的地址:
内存地址:
地址与内存单元中的数据是两个完全不同的概念
变量地址:
int num = 6; // 占用4个字节//那么变量num的地址为: 0ff06char c = 'a'; // 占用1个字节//那么变量c的地址为:0ff05
在计算机中所有数据都存储在内存单元中,而每个内存单元都有一个对应的地址, 只要通过这个地址就能找到对应单元中存储的数据.
由于通过地址能找到所需的变量单元,所以我们说该地址指向了该变量单元。将地址形象化的称为“指针”
内存单元的指针(地址)和内存单元的内容是两个不同的概念。
在C语言中,允许用一个变量来存放其它变量的地址, 这种专门用于存储其它变量地址的变量, 我们称之为指针变量
示例:
int age;// 定义一个普通变量 num = 10; int *pnAge; // 定义一个指针变量 pnAge = &age;
指针变量名;
char ch = 'a';char *p; // 一个用于指向字符型变量的指针p = &ch; int num = 666;int *q; // 一个用于指向整型变量的指针q = #
- 其中,*表示这是一个指针变量
- 变量名即为定义的指针变量名
- 类型说明符表示本指针变量所指向的变量的数据类型
int a = 5;int *p = &a;
int a = 5;int *p;p=&a;
int *p=NULL;int *q=0;
int *p;p = 250; // 错误写法
int *p;*p=&a; //错误写法
注意点:
多个指针变量可以指向同一个地址
指针的指向是可以改变的
int a = 5;int *p = &a;int b = 10;p = &b; // 修改指针指向
所以指针必须初始化才可以访问其所指向存储区域
int *p=NULL; // 定义指针变量
int a = 5;int *p = &a;printf("a = %d", *p); // 访问指针变量
在同一种编译器环境下,一个指针变量所占用的内存空间是固定的。
虽然在同一种编译器下, 所有指针占用的内存空间是一样的,但不同类型的变量却占不同的字节数
所以指针变量需要它所指向的数据类型告诉它要访问多少个字节存储空间
char c = 'a'; char *cp; cp = &c; char **cp2; cp2 = &cp; printf("c = %c", **cp2);
int ***m1; //取值***m1int *****m2; //取值*****m2
只要一个指针变量保存了数组元素的地址, 我们就称之为数组元素指针
printf(“%p %p”, &(a[0]), a); //输出结果:0x1100, 0x1100
- 注意: 数组名a不代表整个数组,只代表数组首元素的地址。
- “p=a;”的作用是“把a数组的首元素的地址赋给指针变量p”,而不是“把数组a各元素的值赋给 p”
int main (void){ int a[5] = {2, 4, 6, 8, 22}; int *p; // p = &(a[0]); p = a; printf(“%d %d\n”,a[0],*p); // 输出结果: 2, 2}
- 如果指针变量p已指向数组中的一个元素,则p+1
指向
同一数组中的下一个元素,p-1指向
同 一数组中的上一个元素。
int x[10]; x++; //错误 int* p = x; p++; //正确
char string[]=”I love lnj!”;printf("%s\n",string);
// 数组名保存的是数组第0个元素的地址, 指针也可以保存第0个元素的地址char *str = "abc"
har *str = "lnj";for(int i = 0; i < strlen(str);i++){ printf("%c-", *(str+i)); // 输出结果:l-n-j}
// + 使用字符数组来保存的字符串是保存栈里的,保存栈里面东西是可读可写,所有可以修改字符串中的的字符// + 使用字符指针来保存字符串,它保存的是字符串常量地址,常量区是只读的,所以我们不可以修改字符串中的字符char *str = "lnj";*(str+2) = 'y'; // 错误
// 错误的原因是:str是一个野指针,他并没有指向某一块内存空间// 所以不允许这样写如果给str分配内存空间是可以这样用 的char *str;scanf("%s", str);
返回值类型 (*指针变量名)(形参1, 形参2, ...);
int sum(int a,int b) { return a + b; } int (*p)(int,int); p = sum;
指针函数定义技巧
应用场景
注意点:
转载地址:http://hiezo.baihongyu.com/