指针
指针就是地址:数据就是在内存中的地址
指针变量:一个变量存储了一份数据的指针
符号:
& 取地址符
* 一个特殊符号,表明一个变量是指针变量
1.1 定义指针变量
格式:
数据类型 *变量名;
数据类型 *变量名 = 值(这个值是一个地址);
int *p //定义P是指向 int 类型数据的指针变量
int *p=&a //定义P是指向a地址的指针变量,且P的值就是a的地址值
注意:
int *p=100 //错误定义 ×
1.2 修改指针变量的值
int *q;
q=&b; //对于已经定义过的指针P,使用时不用再加*号
q++ //int长4byte,q++表示q的地址值加4
注意:
q的类型是int * 型,而不是int型
1.3获取指针变量的值
int *p=&a;
pringtf("%d",*p); //获取指针变量p指向的地址的数据,即a
1.4 表达式:
int x = 2;
int y;
int *px = &x;
y = *px + 5; //把x加5并赋给y=7,*px+5=(*px)+5
y = ++*px; //x加1之后赋给y=6,++*px=++(*px)
y = *px++; //相当于y=*(px++),地址增加4
关于 * 和&
int a=10; ①
int *p=&a; ②
*&a=*(&a)=*p=10:&a表示取变量a的地址(等价于②),*(&a)表示取这个地址上的数据(等价于 *p)
&*p=&(*p)=p=a的地址:*p等价于①,&(*p)表示取a的地址
2.1 数组指针
int arr[5];
*arr //表示指向数组a的第0个元素,即数组首地址/数组的开头,等价于arr[0]
int *p=&arr;//等价于int *p = &arr[0]
sizeof(arr):表示获取a所占的字节数,为4X5=20byte
strlen(arr):表示a的长度,即5
2.1.1 指针数组和二维数组指针的区别
int *(p1[5]); //指针数组,可以去掉括号可写作int *p1[5];
int (*p2)[5]; //二维数组指针,不能去掉括号
1.指针数组是一个数组,只是每个元素保存的都是指针/地址,p1在32位环境下它占用 log(32)×5=20个字节的内存。
2.二维数组指针是一个指针/地址,它指向一个二维数组,以上面为例,它占用 4 个字节的内存。
2.2字符串指针
char str[]="h0ello"
char *p=str;
或者
char *str;
str="hello" //str的类型是char *
printf("%c%c",*(str+i),str[i]);
注意: *str[i]和*(str+i)的区别
两者在内存中的存储区域不一样
*(str+i)字符数组存储在全局数据区或栈区,有读取和写入的权限
*str[i],字符串存储在常量区,只有读取权限,不能写入
2.3 二级指针
int a =100; //定义常量,假设a地址为0x123
int *p1 = &a; //一级指针p1指向a的地址,即存0x123,假设p1地址为0x987
int **p2 = &p1; //二级指针p2指向p1的地址,即存0x987
指针总结
指针变量可以存放基本类型数据、数组、函数以及其他指针变量的地址。
1) 指针变量可以进行加减运算,例如p++、p+i、p-=i,但实际是加i个数据类型所占的byte长度
2) 给指针变量赋值时,要将一份数据的地址赋给它,不能直接赋给一个整数,例如int *p = 1000是没有意义的,使用过程中一般会导致程序崩溃。
3) 使用指针变量之前一定要初始化,否则不能确定指向哪里,如果指向的内存没有使用权限,程序就会崩溃。对于没有指向的指针,可赋值NULL。
4) 两个指针变量可以相减。若两指针变量指向同一数组中的某个元素,那么相减的结果就是两个指针之间的元素个数。
5) 数组也是有类型的,数组名的本意是表示一组类型相同的数据。在定义数组时,或者和sizeof、&运算符一起使用时数组名才表示整个数组,表达式中的数组名会被转换为一个指向数组首地址的指针。
定义 | 含义 |
---|---|
int *p; | p可以指向int类型的数据,也可以指向类似int arr[n]的数组。 |
int **p; | p为二级指针,指向int*类型的数据。 |
int *p[n]; | p为指针数组。[] 的优先级高于*,所以应该理解为int *(p[n]); |
int (*p)[n]; | p为二维数组指针。 |
int *p(); | p是一个函数,它的返回值类型为int *. |
int (*p)(); | p是一个函数指针,指向原型为int func()的函数。 |
空指针是指向的空间位置就是地址0的指针
野指针就是没有对象的指针
类型 | 所占字节 |
---|---|
char | 1 |
char* | 32位即log32=4、64位即log64=8 |
short | 2 |
int | 4 |
float | 4 |
long | 4 |
double | 8 |
ps:
const 的含义是“只读的”,
“左定值, 右定向”(const位于左 指向的值不变,const位于右侧,指针指向不可改变)