【C语言初阶】指针、数组与二级指针
文章目录
五、指针和数组
1 介绍
-
指针变量是用来存放对象地址的,大小是4/8个字节。
-
数组是一组相同类型元素的集合。(数组在内存中是连续存放的。)
2 数组名
数组名表示数组首元素的地址。
代码示例:
#include<stdio.h>
int main()
{
//数组名和指针变量
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("%p\n", arr);//数组名表示数组首元素的地址
printf("%p\n", &arr[0]);//数组首元素的地址
int* p = arr;
p = &arr[0];
return 0;
}
解释说明:
1 以地址的形式分别打印数组名和数组首元素的地址,发现两者的值相同。
2 一般来说,让一个指针指向数组,那么给指针变量赋的值就是数组首元素的地址 &arr[0]
或者数组名 arr
。
也就是说,可以把数组名当成一个地址存放到指针变量中去。
3 数组元素地址与指针偏移
代码示例:
#include<stdio.h>
int main()
{
//数组元素地址与指针偏移
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);//数组长度
int* p = arr;//指针存放数组名
int i = 0;
for (i = 0; i < sz; i++)
{
printf("&arr[%d] = %p <==> p+%d = %p\n", i, &arr[i], i, p + i);
}
return 0;
}
解释说明:
1 我们发现:&arr[i]
<==> p+i
,对下标为 i
的数组元素取地址和指针偏移 i
的结果,二者是相同的。
2 也就是说,随着数组下标的增长,数组元素的地址是从低到高增长变化的。
3 p+i
计算的就是数组下标为 i
的地址。
4 通过指针访问数组
代码示例:
#include<stdio.h>
int main()
{
//通过指针访问数组
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);//数组长度
int* p = arr;//指针存放数组名
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d\t", arr[i]);
printf("%d ", *(p + i));
printf("\n");
}
return 0;
}
解释说明:
1 通过指针访问数组:*(p + i)
2 通过下标访问数组:arr[i]
六、二级指针
存放一级指针变量地址的指针变量称为二级指针。
1 示例
代码示例:
#include<stdio.h>
int main()
{
//二级指针
int a = 10;
int* pa = &a; //一级指针
int* ppa = &pa; //二级指针
return 0;
}
解释说明:
1 一级指针变量 pa
存放整型变量 a
的地址。
2 二级指针变量 ppa
存放一级指针变量 pa
的地址。
2 图示说明
3 关系说明
示例:
pa <==> &a
ppa <==> &pa
*pa <==> a
*ppa <==> pa
**ppa <==> a
**ppa --> *(*ppa) --> *(pa) --> a
说明:
1 *ppa
,通过对 ppa
中的地址进行解引用,就能找到 pa
;*ppa
访问的是 pa
。
2 **ppa
,先通过 *ppa
找到 pa
;然后对 pa
进行解引用操作:*pa
,就能找到 a
;**ppa
访问的是 a
。
七、指针数组
指针数组,顾名思义,就是存放指针变量的数组。
1 其他数组
示例:
int arr[6];//整型数组,存放6个整型值
char ch[5];//字符数组,存放5个字符值
说明:
2 指针数组
示例:
int* Arr[5];//指针数组,存放5个指针值(指针值就是地指针变量的值)
说明:
3 示例
代码示例:
#include<stdio.h>
int main()
{
//指针数组
int arr1[] = { 1,2,3 };
int arr2[] = { 2,3,4 };
int arr3[] = { 3,4,5 };
int* parr[] = { arr1,arr2,arr3 };//指针数组,存放指针值
//打印三个数组的首元素
printf("%d\n", parr[0][0]);//1
printf("%d\n", parr[1][0]);//2
printf("%d\n", parr[2][0]);//3
return 0;
}
解释说明:
1 parr[1][0]
:parr[1]
相当于 arr2
,parr[1][0]
相当于 arr2[0]
。
parr[1] --> arr2
*(parr+1) --> arr2
parr[1][0] --> arr2[0] --> 2
*(*(parr+1)) --> *(arr2) --> 2
//arr2[0] <==> *(arr2+0)
八、二级指针与指针数组
代码示例:
#include<stdio.h>
int main()
{
//二级指针与指针数组
char arr1[] = "abcd";
char arr2[] = "hello";
char arr3[] = "wdt";
//指针数组
char* parr[] = { arr1,arr2,arr3 };
//二级指针
char** pparr = &parr;
return 0;
}
解释说明:
1 数组类型:
arr1:char [5]
arr2:char [6]
arr3:char [4]
parr:char* [3]
2 指针类型:
pparr:char**
3 图示关系:
总结:
本节介绍了指针和数组、二级指针、指针数组以及它们之间的联系。
感谢您的阅读!如有任何错误,欢迎您的批评指正!