指针数组以及数组指针

本文通过实例讲解了指针数组与数组指针的区别及应用,包括定义方式、数组下标的匹配、指针间接级别的差异等,并通过自测小程序加深理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    首先用几个表达式直观的感受一下什么是指针数组以及数组指针。

    一.表达式

    int *p[10];//指针数组
    int (*p)[10]//数组指针

  有了直观的感受那么我们具体分析,指针数组以及数组指针是怎么定义的。

wKioL1ZRoHPDl0uXAABOVZ2Rh9g085.png

      1).指针数组:实质是数组,数组中存放的元素是指针。

      2).数组指针:实质是指针,指针变量中存放的是数组首元素的地址。

    二.分析小程序理解数组指针


    int main()
    {
    	char a[5] = { 'A', 'B', 'C', 'D' };
    	char(*p3)[4] = &a;
    	char(*p4)[5] = a;
    	system("pause");
    	return 0;
    }

       1).编译上述程序

wKioL1ZRomGwdRdRAAA87KWN8Hc923.png

       (1).第一个警告告诉我们char (*)[4]和char (*)[5]的数组下标不同,只需要将‘4’改成‘5’即可。

       (2).第二个警告告诉我们char (*)[5]与char *的间接级别不同。为什么呢?原因为,字符数组char a[5]的类型的类型是char *,指针指向字符。而char (*p4)[5]的类型是char (*)[5],指针指向数组。

       (3).如果要输出(p3+1)的地址呢?会是什么呢?同样我们用代码来分析。

    
        #include<stdio.h>
        
        int main()
        {
        	char a[5] = { 'A', 'B','C','D' };
        	char(*p3)[5] = &a;
        	//char(*p4)[5] = a;//char(*)[5]和char*的间接级别不同
        	int size = sizeof(a) / sizeof(a[0]);
        	int i = 0;
        	for (i = 0; i < 6; i++)
        	{
        		printf("%p\n", &a[i]);
        	}
        	printf("++++++%d", size);
        	printf("-------%p\n", p3+1);
        	system("pause");
        	return 0;
        }

wKiom1ZRpoSTvqRWAAAgGURIrMA821.png

    为了分析我将字符数组的地址也都输出了。并且多输出一块空间以便于分析。我们不难发现(p3+1)的地址是向后整整偏移了一个字符数组的大小,那么我们也就可以理解,数组指针的含义了。

    注意:字符数组后面也是有'\0'的!!!不单单是字符串。这一点我们可以用sizeof求数组大小,同时在使用memcpy内存拷贝函数的时候尤为重要。你们肯定会有疑问,内存拷贝函数是以(size_t count)作为拷贝条件,为什么还要有拷入'\0'?原因很简单,如果不将‘\0’拷入的话,结果还是字符串么?能不能正确使用strlrn函数?所以,这就是为什么要将‘\0’拷入的原因了。很重要!

    三.自测小程序

#include <stdio.h>

int main()
{
	int a[4] = { 1, 2, 3, 4 };
	int *ptr1 = (int *)(&a + 1);//4
	int *ptr2 = (int *)((int)a + 1);
	printf("%x,%x", ptr1[-1], *ptr2);//*(ptr1+(-1))
	system("pause");
	return 0;
}

    输出的是什么?


以上就是本人在学习过程中的一些经验总结。当然,本人能力有限,难免会有纰漏,希望大家可以指正。

本文出自 “做一个小小小司机” 博客,请务必保留此出处http://10799170.blog.51cto.com/10789170/1715728

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值