C语言基础 数组指针和指针数组

//指针数组和数组指针

//指针数组是一个存放指针的数组。
1#include<stdio.h>
int main(){
	int arr1[]={1,2,3,4,5};
	int arr2[]={2,3,4,5,6};
	int arr3[]={3,4,5,6,7};
	int* p[]={arr1,arr2,arr3};
	int i=0;
	for(i=0;i<3;i++){
		int j=0;
		for(j=0;j<5;j++){
			printf("%d ",*(p[i]+j));
		}
		printf("\n");
	}
return 0;
}
2#include <stdio.h> 
int main()
{
    int arr[10] = { 0 }; 
	printf("arr = %p\n",arr);
	printf("&arr= %p\n",&arr);

    printf("arr+1 = %p\n" , arr+1); 
	printf("&arr+1= %p\n" , &arr+1); 
    return 0 ;
}
根据上面的代码我们发现,其实&arr和arr ,虽然值是一样的,但是意义应该不一样的。 实际上:&arr表示的是数组的地址 ,arr是数组首元素的地址。数组的地址+1 ,跳过整个数组的大小,所以&arr+1相对于&arr 的差值是40.

//数组指针是一个指向数组的指针,存放数组的地址
1int (*p)[10];
//p先和*结合,说明p是一个指针变量,然后指向一个大小为10的整型的数组,所以p是一个指针,指向一个数组
//[]的优先级高于*号的,所以要加括号
2char* arr[5];
char*(*pa)[5]=&arr;
//pa是指针变量的名字
//括号内的*说明pa是指针
//char*表示指向的数组的元素类型是char*
//[5]表示指向的数组有5个元素
3//参数为数组的形式
#include <stdio.h>
void print_arr1(int arr[3][5], int x, int y) 
{
    int i = 0 ;
    for(i=0;i<x;i++) 
	{
		int j=0;
        for(j=0;j<y;j++) 
		{
            printf("%d ",arr[i][j]); 
		}
        printf("\n");
    }
}
//参数为指针的形式
//*arr中的*说明arr是指针,[5]说明指向数组是5个元素的,int说明指向数组的类型是int型
void print_arr2(int(*arr)[5],int x,int y)
{
	int i=0;
	for(i=0;i<x;i++)
	{
		int j=0;
		for(j=0;j<y;j++) 
		{
			//二维数组类似于一维数组,可参考下面的一维数组可得出同等结论
			//输出二维数组里的每个元素
			printf("%d ",arr[i][j]);
			//先得到行首元素下标,然后每行都从首个元素开始加j,得到整个二维数组的地址,然后解引用,从而得到二维数组的每个数字
			printf("%d ",*(arr[i]+j));
			//得到行地址后直接解引用,所以*(arr+i)等同于arr[i],得到每行首元素再遍历j,由[j]得到所有元素
			printf("%d ",(*(arr+i))[j]);
			//*(arr+i)(等价于arr[i])找到每一行,拿到每一行的数组名(等价于拿到首元素下标),*(arr+i)+j,找到下标为j的地址,最后将每一行的j都解引用即可得到整个数组的数字
            printf("%d ",*(*(arr+i)+j));
		}
        printf("\n");
	}
}        
int main() 
{
	int arr[3][5] = {{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7}}; 
	print_arr1(arr , 3 , 5);
    //数组名arr,表示首元素的地址
    //但是二维数组的首元素是二维数组的第一行
    //所以这里传递的arr,其实相当于第一行的地址,是一维数组的地址 
	//可以数组指针来接收
    print_arr2(arr , 3 , 5); 
	return 0 ;
}
4//一维数组的四种输出方式
#include<stdio.h>
int main(){
	int arr[10]={1,2,3,4,5,6,7,8,9,10};
	int i=0;
	int* p=arr;
	for(i=0;i<10;i++)
	{
		//四个输出的形式有所不同,但是表达的结果是一样的,都是打印arr数组
		//p所指向的就是arr的地址,即数组首元素的地址,所以两者都可以遍历数组,解引用以后输出数组内数字
		printf("%d ",*(p+i));
		printf("%d ",*(arr+i));
		//arr[],[]里面是数组下标,遍历下标即是遍历数组内数字,同样,p等于arr,所以p[]意义和arr[]一样
		printf("%d ",arr[i]);
		printf("%d ",p[i]);
	}
return 0;
}
5、在实际应用过程中,在以为数组中并不常用数组指针,数组指针可能更常见于二维等更高维的数字中,但是我们也应该掌握这个知识点。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值