目录
一 数组名的理解
由上图可知我们使⽤ &arr[0] 的⽅式拿到了数组第⼀个元素的地址,但是其实数组名本来就是地址,⽽且是数组⾸元素的地址,以前我们只写数组名是为了方便理解。
那是不是不管在哪里数组名就是数组⾸元素(第⼀个元素)的地址呢?
输出的结果是:40,如果arr是数组⾸元素的地址,那输出应该的应该是4/8才对。 其实数组名就是数组⾸元素(第⼀个元素)的地址是对的,但是有两个例外:
二 使⽤指针访问数组
将*(p+i)换成p[i]也是能够正常打印的,所以本质上p[i] 是等价于 *(p+i),同理arr[i] 应该等价于 *(arr+i),数组元素的访问在编译器处理的时候,是转换成⾸元素的地址+偏移量求出元素的地址,然后解引⽤来访问。
三 ⼀维数组传参的本质
# include <stdio.h>void test ( int arr[]){int sz2 = sizeof (arr)/ sizeof (arr[ 0 ]);printf ( "sz2 = %d\n" , sz2);}int main (){int arr[ 10 ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 };int sz1 = sizeof (arr)/ sizeof (arr[ 0 ]);printf ( "sz1 = %d\n" , sz1);test(arr);return 0 ;}
void test ( int arr[]) // 参数写成数组形式,本质上还是指针{printf ( "%d\n" , sizeof (arr));}void test ( int * arr) // 参数写成指针形式{printf ( "%d\n" , sizeof (arr));}
总结:⼀维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。本质上数组传参传递的是数组⾸元素的地址。
四 冒泡排序(后续还会更新更多排序)
五 ⼆级指针 【指针有三级、四级等只是⼆级相对常用】l
1 作用:类比于一级指针的1作用,我们便会想到二级指针的作用是用来存放一级指针变量的地址。
2 对于⼆级指针的运算
int a=10;
int *pa=&a;
int ** ppa=&pa;
int b = 20 ;*ppa = &b;//等价于pa=&b;
•**ppa 先通过 *ppa 找到 pa ,然后对 pa 进⾏解引⽤操作: *pa ,那找到的是 a。
**ppa = 30 ;//等价于*pa = 30;//等价于a = 30;
六 指针数组
1定义:指针数组顾名思义就是用来存放指针的数组。指针数组的每个元素都是⽤来存放地址(指针)的。
七 指针数组模拟⼆维数组
1限制:每个数组元素个数一样,不一样最好别用很麻烦。
2实现方式:
用数组的个数来代替行数,只要得到每个数组首元素的地址便可以得到数组存储的数据,而数组中元素的个数用来代表尼斯列数。所以每个数组元素个数一样,不一样最好别用很麻烦。
本篇文章就到此结束,希望有所能帮到 读者更好的了解指针,后续还会继续更新指针相关识。