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

指针和数组

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

                                          指针和数组区别   

指针数组
指针(变量)——是一个变量,放地址数组——是一块连续的空间,放的是相同类型的元素。
指针变量大小是 4(32位系统下)或者8(64位系统下)个byte数组的大小和元素类型,元素个数有关系

 那我们再来看看他们之间的联系,我们通过代码来讲解:

#include <stdio.h>
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 <stdio.h>


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;
}

指针数组

指针数组是指针还是数组?

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值