c语言|C语言——指针初识(三)(指针和指针数组,一级指针,二级指针详解)

c语言|C语言——指针初识(三)(指针和指针数组,一级指针,二级指针详解)
文章图片

指针和数组 【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个字节的空间所以:
c语言|C语言——指针初识(三)(指针和指针数组,一级指针,二级指针详解)
文章图片


我们取地址a取到的是一个地址,我们把这个地址存到int* p这个指针变量中,那么同理int* p在内存中也开辟了4个字节的空间,那么在空间中我们的代码是这样展示的:
c语言|C语言——指针初识(三)(指针和指针数组,一级指针,二级指针详解)
文章图片

我们这里把p叫做一级指针。那么既然我们的p中存放了一个地址,我们能否把p中的地址取出来呢?当然是可以的,因为p是个变量。那么同理pa就是我们的2级指针。
总结:二级指针是存放一级指针变量地址的。

int main() { int arr[10]; //整型数组 ——存放整形的数组就是整形数组 char ch[5]; //字符数组——存放字符的数组就是字符数组 //指针数组——存放指针的数组就是指针数组 //int* 整形指针数组 //char* 字符指针数组 int* parr[5]; //整型指针数组 char* pc[6]; //字符指针数组return 0; }

指针数组 指针数组是指针还是数组?
是数组。是存放指针的数组。 数组我们已经知道整形数组,字符数组。

    推荐阅读