写在前面:此文为本人对指针从入门到掌握学习的部分笔记,文中的大部分图片和代码均来自原文,笔者仅作个人的一些理解,发布文章全为下一个笔记腾地方。
一、指针
1、什么是计算机的内存和地址
32位系统的一共有的32次方个存储单元,每个存储单元的大小是一字节,即共有4GB内存。
我们编程中的每一行代码,代码中用到的每个数据,都需要在内存上有其映射地址。
例如:
int a=4,即在内存上开辟一个四个字节的连续地址空间,内容为
00000000 | 00000000 | 00000000 | 00000100 |
,内存地址为
0x80495f8 | 0x80495f9 | 0x80495fa | 0x80495fb |
。
内存地址是内存当中存储数据的一个标识,并不是数据本身,通过内存地址可以找到内存当中存储的数据。
存储字符的方式有ASCII码,每个字符对应一个ASCII值,一个ASCII又对应一组二进制数,最终存入内存。
2、指针变量与指针与地址的关系
7、指针类型与指向元素的类型
二、指针与一维数组
数组名=指针=元素地址
例 arr = p = 00CFF750
数组的第一个元素从0开始 是因为 等价为 *(arr+0)
三、指针数组与数组指针
1、指针数组与数组指针
指针数组 :int *arr[4]={&a,&b,&c,&d} (arr是数组名,也是首个指针的地址,本质上是一个二维指针,即**arr)
数组指针 :int (*arr)[4]=&arr ( 先定义arr[4] )
在命名方式上可以看出,指针数组的本质是数组,例如一维数组,二维数组,指针数组。而数组指针的本质是指针,指向了数组。这是一个数组的指针,该指针指向的地址是数组的地址。
下面是一个数组指针的例子
实际上,p=&arr , *p=arr,
2、指向指针数组的指针
int*(*p)[10]是一个指向指针数组的指针,其中,这个指针的类型是int*(*)[10],指向的元素类型是
int*[10],意为一个存储了十个int*指针的数组
3、数组指针与二维数组
一维数组的数组名是首元素的地址,而二维数组的数组名是第一行一维数组的地址。(上图有一些错误,事实上,第一行的意思就是首行,没有第零行的概念)
由此可知,二维数组本质上与数组指针相同,他们都指向了一个数组的地址。
此外,在一维数组中,*arr=首个元素,而在二维数组中,*arr=首个元素的地址(第一行第一个元素的地址)的原因,也可以从上文中开出。一维数组解引用可以直接出元素,这是因为一维数组名是首个元素的地址;而二维数组解引用还是地址,是因为二维数组的数组名仅是第一行这个数组的地址而非元素的地址,得再次解引用才能得到首个元素。
因此,也可以用数组指针输出二维数组。额外解释一下*(arr[i]+j),其中,arr[i]是第i行的地址,+j则表示地址+一个字节,再解引用得到 i,j号元素。
运算时注意符号优先级,*等价于乘号,比加号优先级高,比括号低。
四、指针传参
1、数组传参
不管是数组传参还是指针传参,传的都是指针(地址),只要搞明白你要传的地址是什么类型的,然后用对应的类型指针接收即可,就这么简单
五、函数指针
较为复杂,故只给出图