21.数组&指针相关知识点

1.数组反转

#include <stdio.h>

void init(int *arr,int size){
	int i;
	for(i=0;i<size;i++){
		printf("请输入第%i个元素的数据:\n",i+1);
		scanf("%d",&arr[i]);
	}
}

void nixu(int *arr,int size){
	int i,j;
	int temp;
	for(i=0;i<size/2;i++){
		j = size-1-i;
		temp = *(arr+i);
		*(arr+i) = *(arr+j);
		*(arr+j) = temp;
	}
}

void print(int *arr,int size){
	int i;
	for(i=0;i<size;i++){
		printf("%d ",arr[i]);
	}
	printf("\n");
}

int main(){
	int arry[5];
	int size = sizeof(arry)/sizeof(arry[0]);
	
	init(arry,size);
	print(&arry[0],size);
	nixu(arry,size);
	print(&arry[0],size);
	return 0;
}

2.二维数组的地址相关知识点

在这里插入图片描述

  • 指针=地址

  • 数组名是一个指针常量,指向数组的首地址

  • a:父数组(行地址);a+1;偏移的是整个数组(也就是a[0]跳到a[1])

  • a[0]:子数组(列地址):a[0]+1:元素1跳到元素3

    *a = * (a+0) = a[0]

  • 代码

    #include <stdio.h>
    
    int main(){
    	int arr[3][4] = {{11,22,33,44},{12,13,15,16},{22,66,77,88}};
    	printf("arr是父数组:%p,偏移1后的地址是%p\n",arr,arr+1);
    	printf("arr[0]是子数组:%p,偏移1后的地址是%p\n",arr[0],arr[0]+1);
    	
    	//等价
    	//二维数组的取值,每个元素又是一个数组(对数组的操作,得到数组的首地址)
    	printf("arr[0]是子数组:%p,偏移1后的地址是%p\n",*(arr+0),*(arr+0)+1);
    }
    
    #include <stdio.h>
    
    int main(){
    	int arr[3][4] = {{11,22,33,44},{12,13,15,16},{22,66,77,88}};
    	int i;
    	int j;
    	
    	for(i=0;i<3;i++){
    		for(j=0;j<4;j++){
    			printf("add:%p,data:%d\n",&arr[i][j],arr[i][j]);
    			printf("add:%p,data:%d\n",&arr[i]+j,*(arr[i]+j));
    			printf("add:%p,data:%d\n",*(arr+i)+j,*(*(arr+i)+j));
    			printf("=========================================\n");
    			//三个方式的写法都是一样的
    		}
    		printf("\n");
    	}
    }
    
  • 二维数组a的有关指针
    在这里插入图片描述

  • 二维数组的知识点多复习复习

3.数组指针

  • 数组指针:强调的是指针

  • 代码

    #include <stdio.h>
    
    int main(){
    	int a[3][4] = {{11,22,33,44},{12,13,15,16},{22,66,77,88}};
    	int i;
    	int j;
    	int *p;
    	p = &a[0][0];
    	
    	for(i=0;i<3;i++){
    		for(j=0;j<4;j++){
    			printf("%d\n",*p++);	
    		}
    		printf("\n");
    	}
    }
    
    //数组指针:定义一个指针,指向数组
    #include <stdio.h>
    
    int main(){
    	int arr[3][4] = {{11,22,33,44},{12,13,15,16},{22,66,77,88}};
    	int i;
    	int j;
    	
    	//数组指针:定义一个指针指向数组
    	int (*p2)[4];
    	p2 = arr;
    	for(i=0;i<3;i++){
    		for(j=0;j<4;j++){
    			printf("%d\n",*(*(p2+i)+j));
    			
    		//printf("%d\n",*(*(arr+i)+j));
    		//写法一样
    		}
    		printf("\n");
    	}
    }
    
    #include <stdio.h>
    
    int main(){
    	int arr[3][4] = {{11,22,33,44},{12,13,15,16},{22,66,77,88}};
    	int i;
    	int j;
    	
    	//数组指针:定义一个指针指向数组
    	//数组指针=二维数组名
    	int (*p2)[4];
    	p2 = arr;
    	
    	printf("p2=%p\n",p2);
    	printf("++p2=%p\n",++p2);
    	
    	for(i=0;i<3;i++){
    		for(j=0;j<4;j++){
    		
    		}
    		printf("\n");
    	}
    }
    

4.数组指针和二维数组的配合应用

输出二维数组任意行列的数

#include <stdio.h>

void tipe_input(int *pm,int *pn){
	printf("输入行列值\n");
	scanf("%d%d",pm,pn);
	printf("\n");
	
	
	//第二种
	//return p[hang][lie];
}

int tipe_getdata(int (*p)[4],int hang,int lie){
	int data;
	data = *(*(p+hang)+lie);
	return data;
	
}

int main(){
	int arr[3][4] = {{11,22,33,44},{12,13,15,16},{22,66,77,88}};
	int ihang;
	int ilie;
	int data;
	
	//1.提示用户输入行列值
	tipe_input(&ihang,&ilie);
	//2.找出对应行列值的那个数
	data = tipe_getdata(arr,ihang,ilie);
	
	//3.打印出来
	printf("%d行%d列的值是%d\n",ihang,ilie,data);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值