数组指针&一维数组&二维数组ve

为什么需要数组指针 【数组指针实际上还是一个指针】

/* 说明:
数组指针实际上还是一个指针,所以它的存储空间 是一个固定的值
32位操作系统中为4,64位的操作系统中为 8 。

*/
//实际上在二维数组的函数传参中,接收的函数形参类型就是 数组指针!!!

  1. 方便模块化->也就是把数组的地址传入函数中,然后进行操作
  2. 方便查找,遍历...操作
  3. 实际上这个好处就和数组的好处一样,
    1. 利用指针一个可以省去很多不必要的内存空间
    2. 利用指针可以不必重复定义,省去的繁琐的操作
    3. 基于上述第二点可以进行模块化的操作,非常灵活!!!
#include <stdio.h>

int main(){

	void ArrayTRA(int a[][4]);
    int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };//二维数组初始化 
    ArrayTRA(a);
    return 0;
}
void ArrayTRA(int a[][4]/*实际上在二维数组的函数传参中,接收的函数形参类型就是 数组指针!!!*/){

	int (*p)[4] = a,i,j,count=0; 
	for(i=0;i<3;i++){
		for(j=0;j<4;j++){
			printf("%d ",*(*(p+i)+j)); //这里 【*(p+i)为行 +j 为列 】 在来一个* 为取值运算
			if(++count%4==0)printf("\n");
		}
	}
	

}


数组指针&一维数组

//数组指针 
#include <stdio.h>
int main(){
   
	int a[10]={0};
	int (*p)[10];
	p=&a;
	
	printf("%ox\n",p);// p 在上面存放了是&a的地址所以 为&a,a的地址
	printf("%ox\n",*p); //这里*p 我理解为还是地址 ,是为了方面 *p+1来使用。 方便查找数组元素
	printf("%ox",&a[1]); 

    return 0;
}
//数组指针的遍历元素
#include <stdio.h>
int main(){
   
	int a[10]={0};
	int (*p)[10],i;
	p=&a;
	
	for(i=0;i<10;i++)
		printf("%-3d",*(*p+i)); 


    return 0;
}

数组指针与二维数组

数组指针的初始化 &二维数组的指向

#include <stdio.h>
int main(){
    int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };//二维数组初始化 
    int (*p)[4] = a,i,j; //实际指向的是 行为4列的指针,一维数组和二维数组都可 
    printf("%ox\n", *p+1); /*这里的*p实际上就是一个地址【这里的*p实际可以加*(p+1)表示第几行
						   指向的二维数组的第一行的第一个元素(默认)+1表示列 第几列元素*/
	printf("%ox\n",&a[0][1]);
	
	
    return 0;
}
printf("%ox\n", *(p+1));//这两个是等价的 *p指向行地址
printf("%ox\n",&a[1]);


二维数组中的等价关系

a+i == p+i
a[i] == p[i] == *(a+i) == *(p+i)
a[i][j] == p[i][j] == *(a[i]+j) == *(p[i]+j) == *(*(a+i)+j) == *(*(p+i)+j)

利用数组指针来进行二维数组的遍历

#include <stdio.h>
int main(){


    int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };//二维数组初始化 
    int (*p)[4] = a,i,j,count=0; 
	for(i=0;i<3;i++){
		for(j=0;j<4;j++){
			printf("%d ",*(*(p+i)+j)); //这里 【*(p+i)为行 +j 为列 】 在来一个* 为取值运算
			if(++count%4==0)printf("\n");
		}
	}
	
    return 0;
}

指向二维数组的指针、

int a[2][3] ={1,2,3,4,5,6,7,8,9},*p ;
int m,s;
p=&a[0][0];
m=(*p)*(*(p+2))*(*(p+4));
s=p[1]+p[3]+p[5];//其实这里就是吧二维数组当成了一维数组来使用 !

数组的遍历

#include <stdio.h>
int main(){
    
	
	int arr[3][4]={1,2,3,4,5,6,7,8},*p,i;
	p=&arr[0][0];//把数组的首元素的地址赋值给 p
	for(i=0;i<12;i++)
		printf("%-3d ",p[i]);
    return 0;
}
posted @ 2023-03-13 14:50  Development_UP  阅读(27)  评论(0)    收藏  举报