注
本文是我在学习和观看指针讲解视频的一些关于指针的理解,可能有一些问题,如有问题,欢迎指出交流
一.什么是指针
首先我们需要了解,电脑与芯片的内存均有自己的编号,每一个编号代表一个字节,定义变量的变量名的地址为分配的内存的首个地址值,并且将内容以栈的形式存入;
注意:地址也被称为指针。
而 指针变量,是存储其他指针或变量的地址的变量
例如:
int a = 1;
int * p = &a; //*代表指针变量,int代表指向的地址变量
而*p可以对p所存的地址的变量直接改变,
二.认识指针
1.指针变量大小:
1.大小:取决于一个地址存放所需要的空间,32位有32根地址线-32bit,所以是4Byte;其他变量存储自己类型大小的数据,变量名有自己的地址,而指针变量存着指向变量的地址,
2.指向不同类型的指针的不同点:
在*p——对指向的变量进行改变时,会改变类型大小的字节数据,int改变4个字节,char改变一个字节。
在对指针变量进行加减时,指针会跳到下一个变量,所以会按照指向的类型存储字节大小增减
2.指针使用注意:
1.指针使用的一些问题/错误
1.对一个随机的地址,解引用改变值,会造成错误;可能是指针未初始化,也有可能是接收了一个局部变量(保存后局部变量释放空间)
2.在函数中,让指针指向了超过指向类型大小的地址,即不属于这个类型的空间
2.指针使用注意点
1.指针定义后要初始化,即使暂时不用也要赋值NULL;
2.因为NULL也是不能改变的内存,所以使用前要注意判断p是否=NULL;
三.指针的运算
1.加减整数:
会按照指向的类型的大小字节进行增减:
例如
int* pointi_test = &test_a_num;
char* pointc_test = &test_a;
pointi_test+1指向加4后的地址,pointc_test+1指向加1后的地址.
2.减一个指针:
两个指针间元素的个数,且只有指向同一块空间的指针可以相减(例如:同一种类型)
例如:
int arr[5] = {0};
int* pointi_test = &arr;
printf("%d\n", &arr[4] - &arr[0]);
int* pointi_test1 = pointi_test;
for (; pointi_test != &arr[4]; pointi_test++);
printf("%d\n", pointi_test - pointi_test1);
运行结果均为4;
3.比较
规定:数组元素指针可以与其后一个元素的地址比较,但是不能与第一个元素之前的地址比较
四.二级指针
指用来存储一级指针变量地址的变量,并且使一级指针变量建立起联系,使得一级指针指向的变量可以建立起联系(如:用指针与一维数组表示出二维数组)
例如
int test = 0;
int* pa = &test; //一级指针
int** ppa = &pa; //二级指针
关于指针的知识点:
1.&——取地址符
2.%p——以地址形式
3.数组:
数组名是存储的首元素地址,int a[2];a与&a[0]是一样的,对数组队员取地址就是通过数组名去计算;
而a[1] == *(a+1)。