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

C语言——指针初识(三)(指针和指针数组,一级指针,二级指针详解)_第1张图片

指针和数组

谈论指针和数组我么你先来分析分析他们的联系与区别:

                                          指针和数组区别   

指针 数组
指针(变量)——是一个变量,放地址 数组——是一块连续的空间,放的是相同类型的元素。
指针变量大小是 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语言——指针初识(三)(指针和指针数组,一级指针,二级指针详解)_第2张图片

         我们取地址a取到的是一个地址,我们把这个地址存到int* p这个指针变量中,那么同理int* p在内存中也开辟了4个字节的空间,那么在空间中我们的代码是这样展示的:

C语言——指针初识(三)(指针和指针数组,一级指针,二级指针详解)_第3张图片

 我们这里把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语言,c#)