指针归纳总结

指针

指针就是地址:数据就是在内存中的地址
指针变量:一个变量存储了一份数据的指针
符号:
& 取地址符
* 一个特殊符号,表明一个变量是指针变量
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的指针
野指针就是没有对象的指针

类型所占字节
char1
char*32位即log32=4、64位即log64=8
short2
int4
float4
long4
double8

ps:
const 的含义是“只读的”,
“左定值, 右定向”(const位于左 指向的值不变,const位于右侧,指针指向不可改变)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值