C高级(一)C语言指针

指针

指针:(在64位机上,无论什么指针类型都占用8个字节,32位机是4字节)
含义:一个数据类型,用于存储一个地址值
地址:为了快速寻找到指定的内存单元,对内存中的每一个字节进行编址, 在64位机上地址的带下统一是8字节,一个指针变量的大小就是8字节

变量名:是对某一块内存地址的抽象表示,可以理解为地址的别名,若要拿到变量的真实地址,则需要做(&变量)运算

定义指针变量的目的:由于指针记录下来了某块内存的地址,则可以利用指针间接访问到该内存(读取、写入)
指针更多会用在函数的传参上,主要目的是利用地址传递可以在函数内部中进行数据的输出,也可以用作函数参数传递,可以降低内存开销

指针定义的语法
数据类型 *指针名称 = 地址值;
例如:
int a = 10;
int *p = &a;

空指针和野指针:
空指针:指针记录的是NULL,NULL是一个宏,其值为0x0,系统规定0x0地址不分配给任意的进程使用
进程对于该地址是不可读也不可写的,所以若利用该指针向指向的内存中写入或读取数据一定出段错误

建议:对于定义的指针一开始不知道指向什么位置,或是不再使用的指针,都建议初始化为NULL

野指针:指针记录的地址(指向)不明确,或者指向的地址是否具备操作的权利不明确

指针运算:
*:取值运算,获取指针指向内存中的数据
+:指针进行加法运算,是向后偏移N个单位,偏移的单位量取决于指针的类型
-:指针进行加法运算,是向前偏移N个单位,偏移的单位量取决于指针的类型

两个指针可以做减法运算不可以做加法运算,p+1 p的指向没变,p++ p的指向变为后一个地址

万能指针:void *
任意类型的变量的地址都可以赋值给万能指针,万能指针记录的值也可以赋值给任意的指针
不能使用万能指针进行取值或+、-法运算

多级指针:
一级指针记录变量的地址,二级指针记录一级指针的地址,以此类推。
一般情况下:
索要变量的地址,就是要使用一级指针去获取或修改该变量的值
索要指针的地址,就是要使用二级指针去修改或获取一级指针的指向

指针跟数组:

指针和一维数组:
*(arr+n)=a[n]
指针跟字符数组:
char *str = “hello” //占用的是文本常量区的内存,不可修改

如果进行str[0] = ‘a’ 操作,会有段错误

char *str = “hello” 跟 char *str1 = “hello” 占用同一个内存地址
指针跟二维数组:
str[2][3] = {{1,2,3},{2,3,4}}

二维数组的数组名记录的是行首地址
&arr[0][0]:数组中第一个元素的地址
arr[0]:二维数组的首地址(行首地址)
以上三个值是一样的,但意义不同
arr[0] + 1:二维数组中第一个数组的第二个元素首地址
arr + 1:二维数组中第二个数组的首地址

*(arr + 0):二维数组第一行数组首地址
*(arr + 1):二维数组第二行数组首地址
((arr + i)+j) = arr[i][j]

数组指针:是一个指针,指针在N个大小之间的数组来回移动(二维数组函数传参)
语法:数据类型 (*指针名称)[大小];
例如:int (*p)[5]

一维数组使用一级指针来记录其首地址,二维数组使用数组指针来记录其首地址

指针数组:是一个数组,数组中的每一个元素都是一个指针
语法:数据类型 *数组名[大小]
例如: int *p[5]

指针数组使用二级指针来记录其首地址

int arr[2];

int a = 10;
int b = 20;
int *arr[2] = {NULL,NULL};

常量与指针:

常量指针:是一个指针(可读可写),函数定义中一般不加const修饰的指针,一般指针可改并认为有返回值
作用:限制权限(保护别人不保护自己)
语法:const 数据类型 *指针名称 或 指针类型
例如:const int *p
指针的指向(值)可变,但指针指向的内存中的值不可变

指针常量:是一个常量(用的少)
作用:限制权限(保护自己不保护别人)
指针的指向(值)不可变,但指针指向内存中的值可变
语法:数据类型 *const 常量名;
例如:int *const p

常量指针常量:(用的少)
作用:限制权限(保护别人又保护自己)
指针的指向(值)不可变,指针指向的内存中的值也不可变
语法:const 数据类型 *const 常量名;
例如:const int *const p

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值