赞
踩
目录
例题1:输入二维数组的行和列,找出对应二维数组行列的那个值。
访问二维数组值的示意图
- #include<stdio.h>
- int main()
- {
-
- int arr[3][4] = {{1,3,5,7},{2,4,5,6},{11,22,33,44}};
- //三行四列的二维数组
- printf("arr是行的地址%p,偏移后行的地址是 %p \n",arr,arr+1);//二维数组偏移一个行地址,去介于列有多少个元素,这里是四列,类型为int型,所以行偏移16个字节大小。
- printf("arr[0]是列数组地址 %p ,偏移后地址是 %p \n",arr[0],arr[0]+1);
- printf("arr[0]是列数组地址 %p ,偏移后地址是 %p \n",*(arr+0),*(arr+0)+1);
- printf("arr[0]是列数组值 %d ,偏移后值是 %d \n", *(*(arr+0)) , *(*(arr+0)+1) );
-
- return 0;
- }
- arr是父亲地址000000000061FDF0,偏移后地址是 000000000061FE00
- arr[0]是子数组地址 000000000061FDF0 ,偏移后地址是 000000000061FDF4
- arr[0]是子数组地址 000000000061FDF0 ,偏移后地址是 000000000061FDF4
- arr[0]是子数组值 1 ,偏移后值是 3
- #include<stdio.h>
- int main()
- {
- int arr[3][4] = {{1,3,5,7},{2,4,5,6},{11,22,33,44}};
- int i,j;
-
- for(i=0;i<3;i++){
- for(j=0;j<4;j++){
- printf("地址是%p,值是%d\n",&arr[i][j],arr[i][j]);
- printf("地址是%p,值是%d\n",arr[i]+j,*(arr[i]+j)); //arr[i]+j 二维数组在这里arr[i]是数组名字
- printf("地址是%p,值是%d\n",*(arr+i)+j,*(*(arr+i)+j));
-
- putchar('\n');
- }
- putchar('\n');
- }
-
-
- return 0;
- }
- 地址是000000000061FDE0,值是1
- 地址是000000000061FDE0,值是1
- 地址是000000000061FDE0,值是1
-
- 地址是000000000061FDE4,值是3
- 地址是000000000061FDE4,值是3
- 地址是000000000061FDE4,值是3
-
- 地址是000000000061FDE8,值是5
- 地址是000000000061FDE8,值是5
- 地址是000000000061FDE8,值是5
-
- 地址是000000000061FDEC,值是7
- 地址是000000000061FDEC,值是7
- 地址是000000000061FDEC,值是7
-
-
- 地址是000000000061FDF0,值是2
- 地址是000000000061FDF0,值是2
- 地址是000000000061FDF0,值是2
-
- 地址是000000000061FDF4,值是4
- 地址是000000000061FDF4,值是4
- 地址是000000000061FDF4,值是4
-
- 地址是000000000061FDF8,值是5
- 地址是000000000061FDF8,值是5
- 地址是000000000061FDF8,值是5
-
- 地址是000000000061FDFC,值是6
- 地址是000000000061FDFC,值是6
- 地址是000000000061FDFC,值是6
-
-
- 地址是000000000061FE00,值是11
- 地址是000000000061FE00,值是11
- 地址是000000000061FE00,值是11
-
- 地址是000000000061FE04,值是22
- 地址是000000000061FE04,值是22
- 地址是000000000061FE04,值是22
-
- 地址是000000000061FE08,值是33
- 地址是000000000061FE08,值是33
- 地址是000000000061FE08,值是33
-
- 地址是000000000061FE0C,值是44
- 地址是000000000061FE0C,值是44
- 地址是000000000061FE0C,值是44
-
能不能定义一个指针,让指针偏移的时候,也偏移对应大小的数组?
- #include<stdio.h>
- int main()
- {
- int arr[3][4] = {{1,3,5,7},{2,4,6,8},{11,22,33,44}};
- int i,j;
-
- int (*p)[4]; //数组指针的定义
- p = arr; //将数组指针指向二维数组
-
- //数组指针才是真正等同于二位数组
- //有多少列数组就要定义多少列的数组指针,这里是arr是三行四列,所以int (*p)[4];
- return 0;
- }
1. 有多少列数组就要定义多少列的数组指针,这里是arr是三行四列,所以定义一个数组指针是 int (*p)[4];
2.数组指针 int (*p)[4]; 数组指针p++ 的偏移量是整行 ,一行有四个int型一个int型是4字节,所以这里偏移量是16字节
- #include<stdio.h>
- int main()
- {
- int arr[3][4] = {{1,3,5,7},{2,4,6,8},{11,22,33,44}};
- int i,j;
-
- int (*p)[4];
- p = arr;
-
- printf("p = %p\n",p);
- printf("++p = %p\n",++p); //数组指针 int (*p)[4]; p++ 的偏移量是整行 ,这里偏移量是16字节
-
-
- p = arr;
-
- for(i=0;i<3;i++){
- for(j=0;j<4;j++){
-
- printf("arr %d ",*(*(p+i)+j)); //用数组指针访问二维数组的第一种方式
-
- }
- putchar('\n');
- }
-
- putchar('\n');
- p = arr;
-
- for(i=0;i<3;i++){
- for(j=0;j<4;j++){
-
- printf("arr %d ",p[i][j]); //用数组指针访问二维数组的第二种方式
-
-
- }
- putchar('\n');
- }
-
-
- return 0;
- }
- p = 000000000061FDE0
- ++p = 000000000061FDF0 //++p后指针数组的偏移量是16个字节,++p是偏移数组的整行
-
- arr 1 arr 3 arr 5 arr 7 //数组指针访问二维数组的第一种方式
- arr 2 arr 4 arr 6 arr 8
- arr 11 arr 22 arr 33 arr 44
-
- arr 1 arr 3 arr 5 arr 7 //数组指针访问二维数组的第二种方式
- arr 2 arr 4 arr 6 arr 8
- arr 11 arr 22 arr 33 arr 44
- #include<stdio.h>
- void tipsInputHangLie(int *hang,int *lie) //提示用户输入行列的值
- {
- puts("请输入行的值");
- scanf("%d",hang);
-
- puts("请输入列的值");
- scanf("%d",lie);
- }
-
- int getTheData(int (*p)[4], int hang, int lie) //找出对应行列值的那个数
- {
- /*
- int a;
- a = *(*(p+hang)+lie);
-
- return a;
- */
-
- return p[hang][lie];
- }
-
- int main()
- {
- int arr[3][4] = {{1,3,5,7},{2,4,6,8},{11,22,33,44}};
- int hang,lie;
- int data;
-
-
- tipsInputHangLie(&hang,&lie);
- data = getTheData(arr,hang,lie);
- printf("行%d 列%d 的值是%d",hang,lie,data); //打印出找到的结果
-
- return 0;
- }
-
- //6.17数组指针
- 请输入行的值
- 2
- 请输入列的值
- 2
- 行2 列2 的值是33
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。