指针基础
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