C语言-指针

本文详细介绍了C语言中的指针基础知识,包括指针变量、间接访问、地址操作符、指针类型与初始化、指针与数组、指针与函数、以及指针的高级用法如行指针、指针数组、结构体指针、指针的指针和函数指针。强调了指针在内存管理、数组操作和结构体访问中的重要作用,并探讨了动态内存分配和释放的相关函数malloc()和free()。
摘要由CSDN通过智能技术生成

指针基础

1.指针变量是一个特殊的变量,用来存储地址

2.按变量地址存取变量值的方式称为“直接访问”,将变量的地址存在另一个变量中称为“间接访问”

3.查看变量的地址用%p

①取地址

②取值(用*&num)

4.定义一个指针变量

Int *p; 其中int *为数据类型(指针类型) p为变量名

5.指针变量如果没有进行初始化,为野指针,所以一般定义一个指针变量要给指针变量初始化为NULL(NULL被宏定义为(void *)0)

6.如果*前面有数据类型说明跟的是指针变量,用来保存地址;如果*前面没有数据类型,后面跟指针变量,说明要获取地址中的数据,取值

7.指针变量可以直接用“=”赋值

8.指针变量的内存中所占的字节与数据类型无关

在32位系统中,指针变量固定占4个字节

在64位系统中,指针变量固定占8个字节

9.void不能用来定义变量,但是可以用来定义指针变量

10.&是一元运算符,它的返回值是地址

   *也一元反运算符,它的返回值是地址的值

*的右侧只能是一个地址,不能是变量值

&的右侧只要是变量都可以

&和*的优先级一样,但是结合方式是从右向左

11.对指针变量进行++时,指针对应的地址会偏移,偏移的地址与指针数据类型有关(比如一个int类型的指针变量会偏移4个字节)

12.地址可以进行++,说明两地址之间也可以进行比大小

13.常量指针:一个数组的数组名代表整个数组的首地址,这个地址不可以改变,所以是一个常量地址(常量指针)

14.可以用指针来操作数组,通过++的方式来获取数组中的每一个元素的地址

15.指针变量的指向是可以改变的,但是常量指针的指向是不能改变的

16.数组作为函数的形参,表示方式有3种

Char pstr[20]={0};

①char pstr[20]  ②char pstr[]  ③char *pstr

17.一个字符串可以直接赋值给一个指针变量,在该指针中保存的字符串常量在常量区的首地址(指针变量指向字符串常量,且该指针指向的是常量所以不能修改)

18.将一个字符串变量地址赋值给一个指针变量,其值是可以修改的

指针高级

1.行指针:用来操作二维数组的指针,行指针+1,表示偏移一行

(一维数组中num[i]恒等于*(num+i))

获取二维数组值的方式:

2.指针数组:是一个数组,数组中保存的值是地址

指针数组作为函数形参的时候

Char *stu[3]   char *stu[]  char **stu;

3.结构体指针:用结构体指针访问成员:
结构体指针变量名+->+成员名

4.指针的指针

定义:int **p;用来存储指针变量的地址

5,函数指针:保存函数的地址,用函数名表示地址

Void (*p)();

6,无类型指针:void *p:可以将任何类型的指针赋值给无类型的指针;但是不能讲void类型的指针赋值给其他类型的指针,需要通过强转才可以

7,malloc();函数,

①可以允许在堆中分配内存空间;

②返回值是void类型的指针;需要引头文件stdlib.h;

③如果成功能分配到堆中的内存,则返回在该堆区中的首地址,如果没有分配成功,则返回NULL

④一般使用在封装函数中

⑤不能进行++操作

8,用const修饰指针变量:

①const int *p=NULL 等价于 int const *p =NULL

*p的值不能改变

②int *const p=NULL;

p的值不能改变

总结:const右侧的值不能改变

9,memset()函数:用malloc()开辟的内存空间最后先用memset()函数初始化,memset中的参数是地址

10,free()函数:用于释放定义的指针指向的内存空间,使其成为自由的内存空间

Void free(void *p)参数必须为动态分配的首地址,所以动态分配的地址不能进行++操作;释放后的堆区,指向该地址的指针也被释放,所以变成了一个野指针

11.calloc()函数,与malloc()函数相似,区别是该函数会将分配好的内存空间默认初值为0

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值