欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-10 22:38:09
//指针数组和数组指针//指针数组是一个存放指针的数组。#includeint 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...
//指针数组和数组指针

//指针数组是一个存放指针的数组。
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、在实际应用过程中,在以为数组中并不常用数组指针,数组指针可能更常见于二维等更高维的数字中,但是我们也应该掌握这个知识点。

本文地址:https://blog.csdn.net/zhaoxia38324/article/details/111086962