数组指针和指针数组以及数组名

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

区别 “数组指针” 和 “指针数组”,我们只需要看后两个字是指针就是指针,是数组就是数组。

一、指针数组

指针数组:就是用来存地址的数组。
例如:int *arry[3]; 表示arry是一个包含3个元素的数组,每一个元素都是一个指向整数的指针。

//示例
int a = 10;  
int b = 20;  
int c = 30;    

int *arry[3];  
arry[0] = &a;  // arry[0] 现在指向 a  
arry[1] = &b;  // arry[1] 现在指向 b  
arry[2] = &c;  // arry[2] 现在指向 c  
//*arry[0]整数a的值。

二、数组指针

数组指针:就是指向数组的指针。
例如,int (*array_ptr)[Size]; 表示声明了一个指向整型数组的指针,float (*array_ptr)[Size]; 表示声明了一个指向浮点型数组的指针,Size是数组的大小。注意这是数组指针声明的规定写法。

数组指针和其他指针一样也是存的元素的首地址,只不过数组指针存的是整个一维数组的首地址,其跨度为整个数组,而int型指针存的是int类型变量的首地址,跨度为4个字节,依次类推。

  1. 数组指针操作一维数组
//示例
#include <stdio.h>  
int main() {  
    int arr1[3] = {1, 2, 3};
	int arr2[3] = {4, 5, 6};  
    int (*array_ptr)[3] = &arr1;     // 使用&arr1来获取arr1的地址
    /* 注意!尽管 打印arr1和&arr1都是一样的地址,
    但arr1表示首元素的首地址,
	&arr1表示整个数组的首地址 
	*/ 
     printf("%d\n", (*array_ptr)[1]); // 输出 arry 的第二个元素,即 2
     array_ptr = &arr2;              // array_ptr重新指向arr2的地址
     printf("%d\n", (*array_ptr)[1]); // 输出 arr2 的第二个元素,即 5
    return 0;  
}

由于 array_ptr 已经指向了整个数组,所以 *array_ptr 就代表了 数组本身。

  1. 数组指针操作二维数组
//示例
#include <stdio.h>  
int main() {  
    int arr[3][4] = {  
        {1, 2, 3, 4},  
        {5, 6, 7, 8},  
        {9, 10, 11, 12}  
    };  
    //定义数组指针,指向二维数组的第一行(将二维数组降维后,其每一行就是一个一维数组的元素)
	int (*ptr)[4]=arr; 
    printf("%d\n", **ptr); //[0][0]的值,*ptr实质上将ptr降维成了一个整型指针,那么**ptr就是其指向的值
    pprintf("%d\n", *((*ptr)+1)); //[0][1]的值
    printf("%d\n", *(*(ptr+1)));//[1][0]的值,ptr+1将跨过整个一维数组(一行),同样*(ptr+1)也可以理解为一个整型指针,*(*(ptr+1)))就是其指向的值
    return 0;  
}

下面再来看这个

#include <stdio.h>  
int main() {  
    int arr[3][4] = {  
        {1, 2, 3, 4},  
        {5, 6, 7, 8},  
        {9, 10, 11, 12}  
        };      
    // 定义一个整型指针ptr 指向 arr 的第2行(即 arr[1])的第一个元素  
    int *ptr = arr[1]; //事实上,arr[1]就是一个一维数组(第二行)的数组名,因此其指向第二行的首元素
    
    for(int i=0;i<8;i++)
    {// 由于二维数组连续存储,使用 ptr以访问一维数组的形式 来访问从第二行开始的每个元素
	    printf("%d\n", ptr[i]); 
	}
    return 0;  
}

以上程序只是举例帮助理解,实际不推荐这样编写

另外数组名表示首元素的(首)地址,对于一维数组int a[3]={1,2,3} ,a即为元素1的地址,实质是一个整型指针。
对于二维数组 int aa[3][2]={{1,2},{3,4},{5,6}},aa即为首元素{1,2}这个一维数组的地址 ,实质是个数组指针。

总结

一维数组:int arr[i]
&arr:整个数组的地址,赋给数组指针,
arr:数组首元素的地址 ,赋给整型指针
&arr[i]:数组第i个元素的地址,赋给整型指针
arr[i]:第i个元素的值

二维数组:int arr[i][j]
arr:首元素(第一行)的地址,数组指针
arr[i]:第i行首元素的地址,整型指针
&arr[i][j]:第i行j列处元素的地址 ,整型指针
arr[i][j]:第i行j列处元素的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值