自学内容网 自学内容网

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);
}

原文地址:https://blog.csdn.net/weixin_52010671/article/details/142645158

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!