文章图片
指针和数组 【c语言|C语言——指针初识(三)(指针和指针数组,一级指针,二级指针详解)】谈论指针和数组我么你先来分析分析他们的联系与区别:
指针和数组区别
指针 | 数组 |
指针(变量)——是一个变量,放地址 | 数组——是一块连续的空间,放的是相同类型的元素。 |
指针变量大小是 4(32位系统下)或者8(64位系统下)个byte | 数组的大小和元素类型,元素个数有关系 |
那我们再来看看他们之间的联系,我们通过代码来讲解:
#include
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,0};
printf("%p\n", arr);
printf("%p\n", &arr[0]);
return 0;
}
根据之前我们内容里提到过数组名和数组首元素的地址是一样的。
结论:数组名表示的是数组首元素的地址。
数组名确实是首元素地址,但是有两个例外
1sizeof(数组名),这里的数组名不是首元素地址,时表示整个数组的,这里计算的是整个数组的大小,单位还是字节。
2.&数组名,这里的数组名不是首元素地址,时表示整个数组的,拿到的是这个数组的地址。
二级指针
#define _CRT_SECURE_NO_WARNINGS 1#include int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
char ch[5] = { 0 };
printf("%d\n", &arr[9] - &ch[0]);
//err printf("%d\n", &arr[9] - &arr[0]);
//?
printf("%d\n", &arr[0] - &arr[9]);
//?
//指针-指针的前提是两个指针指向同一块区域
//指针-指针 得到的数字的绝对值是指针和指针之间元素的个数 /*int *p = &arr[9];
printf("%p\n", p);
printf("%p\n", p-2);
*/ return 0;
}求字符串长度
为了学习二级指针我们先来看看什么是一级指针。来上代码:
int mian()
{
int a = 10;
int* p = &a;
//一级指针
int** pa = &p;
//二级指针
return 0;
}
通过之前的博客我们可以知道当一个变量a被创建的时候他要在内存中开辟一块自己的空间,我们知道int他是占用4个字节的空间所以:
文章图片
我们取地址a取到的是一个地址,我们把这个地址存到int* p这个指针变量中,那么同理int* p在内存中也开辟了4个字节的空间,那么在空间中我们的代码是这样展示的:
文章图片
我们这里把p叫做一级指针。那么既然我们的p中存放了一个地址,我们能否把p中的地址取出来呢?当然是可以的,因为p是个变量。那么同理pa就是我们的2级指针。
总结:二级指针是存放一级指针变量地址的。
int main()
{
int arr[10];
//整型数组 ——存放整形的数组就是整形数组
char ch[5];
//字符数组——存放字符的数组就是字符数组
//指针数组——存放指针的数组就是指针数组
//int* 整形指针数组
//char* 字符指针数组
int* parr[5];
//整型指针数组
char* pc[6];
//字符指针数组return 0;
}
指针数组 指针数组是指针还是数组?
是数组。是存放指针的数组。 数组我们已经知道整形数组,字符数组。
推荐阅读
- C语言基础|【C语言趣味游戏】猜数字
- 指针|C语言中的数组指针和指针数组的区别,代码+图例详解
- 数据结构|3000字带你深入理解二叉树(图解剖析)
- C语言|【C语言】#define 定义常量和宏
- C语言拯救者|C语言拯救者 番外篇 (函数栈帧的创建和销毁讲解)
- C语言系统学习学习手册|【C语言知识精讲③】函数栈帧的创建和销毁(全程图解)
- C语言基础|【C语言】函数栈帧的创建与销毁
- C语言|C语言实现扫雷游戏+优化(递归)
- c语言|初识c语言5——12.#define定义常量和宏、13.指针、14.结构体(struct关键字)