二维数组行指针的问题

问题描述

二维数组行指针的问题

问一个比较呆的问题,今天看到了这样一个程序,运行结果是9,我就糊涂了
(pa+1)[1]是什么啊
为什么
(pa+1)[0]是5呢
那个方括号里的数字指什么呢
我真是彻底晕了
求指教~
#include
void main()
{
static int a[3][4]={1,2,3,4,5,6,7,8,9,10},(*pa)[4]=a;
cout<<*(pa+1)[1]<<endl;
}


解决方案

#include
int main()
{
int a[3][4] = {
1,2,3,4,
5,6,7,8,
9,10
};
int (*b)[4] = a ;
printf("%d %dn",*(b+1)[1],*(b)[1]);
//测试结果: 9 5
printf("%d %dn",(*(b+1))[1],(*(b))[1]);
//测试结果: 6 2
return 0;
}


看见了吧,相信 你能看明白了。

首先运算符的先后顺序 *b[1] = * (b[1])

而之前 (*b)[4] = a
说明 把 a的首地址 也就是 &(a[0][0]) 赋值给了 (*b)[4] 这个数组 。

(*b)[4] 这个数组 是个 指针数组。 赋值结束后

*b 代表了第一行第一列的值,你可以打出来看看( printf("%dn",*b[0] ), 而b 就代表了第一行第一列 的 首地址 ,所以 b = a.

所以 b[1] = a[1]
so
*(b+1)[1] = * ( (b+1)[1]) = * (b+1 + 1) = * a[2] = a[2][0] ;
over!

解决方案二:

pa+1 是按 pa 的定义直接接 4 个数据,然后再 加 0/1,所以就是下标 4/5 对应的数值.

解决方案三:

数组指针 与 指针数组
你需要看一下上面的博文,了解这两个基本概念。

解决方案四:

代码不全,不知道pa是什么类型。需要根据它的类型判断它+1得到的地址偏移是多少。

解决方案五:

(*pa)[4] = a;这句换一下应该是 pa = (*a)[4]//不知道这样写对不对。它的意思是指针pa指向a的第4列,而(pa + 1)相当于指向第4列的指针都向前移一位,那就是原来的指向4的指针向下移了一位,指向了5即:*(pa + 1)[0] = 5; 原来只想8的指针向下移一位,指向9 即: *(pa+1)[1] = 9;

时间: 2024-08-17 21:53:06

二维数组行指针的问题的相关文章

直观理解C语言中指向一位数组与二维数组的指针_C 语言

一维数组和指针:对于一位数组和指针是很好理解的: 一维数组名: 对于这样的一维数组:int a[5];  a作为数组名就是我们数组的首地址, a是一个地址常量 . 首先说说常量和变量的关系, 对于变量来说, 用箱子去比喻再好不过了, 声明一个变量就声明一个箱子,比如我们开辟出一个苹果类型的箱子, 给这个变量赋值就是把盛放苹果的箱子中放入一个实实在在的苹果, 这就是变量的赋值.  而对于数组来说, 就是一组类型相同的箱子中,一组苹果箱子, 可以放入不同的苹果. 一维数组空间: 变量被声明后, 我们

关于指向二维数组的指针编译出错

问题描述 关于指向二维数组的指针编译出错 #include int m; int n; int a[10][10]; void InputArray(int *p, int m, int n); int main(void) { int *(ptr)[10]; ptr=a; printf("Input m,n: "); scanf("%d,%d",&m,&n); InputArray(*ptr,m,n); } void InputArray(int

二维数组与指针-C语言二维数组中的*(p+1)的确切含义

问题描述 C语言二维数组中的*(p+1)的确切含义 各位大师们,烦请指教一二吧.如果是在一维数组中,*(p+1)表示p+1这个地址空间或空间中的值,那么在二维数组中,p+1是指向a[1]*(p+1)是a1这个地址中的值啊?可是为什么会是地址呢? 解决方案 二维数组其实是一个小戏法,本质上还是一维数组--二维下标连续构成的数组又连续构成第一维下标.你可以像遍历一维数组那样遍历它 解决方案二: 其实a[2][3]的调用可以看成是两个调用,首先是对a进行[2]操作,然后再对a[2]的返回值进行[3]操

数组 指针-c语言二维数组的指针问题

问题描述 c语言二维数组的指针问题 在WinTC下运行如下代码 #include void main() { char a1[][5]={"ab","cd","ef","ghi","sfs"}; printf("%sn",*(a1+3)); //语句1 printf("%cn",**(a1+3)); //语句2 } 运行结果为: ghi g 但如果将上述语句1中的%s

《C语言及程序设计》实践项目——二维数组与指针

返回:贺老师课程教学链接 [项目1-二维数组当函数参数]定义一个函数来完成对参数数组中元素的求和工作,函数声明如下: int sum(int array[ ][4],int m,int n); //该函数完成对array数组中的前m行和n列元素求和 在以下程序的基础上,完成对sum函数的定义. #include <stdio.h> int sum(int array[ ][4],int m,int n);//该函数完成对array数组中的前m行和n列元素求和 int main() { int

《C语言及程序设计》程序阅读——二维数组与指针

返回:贺老师课程教学链接 (1) #include <stdio.h> int aa[3][3]= {{2},{4},{6}}; int main() { int i ,*p=&aa[0][0]; for(i=0; i<2; i++) { if(i==1) aa[i][i+1]=*p+1; else ++p; printf("%d ",*p); } return 0; } (2) #include <stdio.h> int main() { in

C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表本文由 arthinking 发表于315 天前 ⁄ itzhai.com原创文章 ⁄ C语言 ⁄ 评论数 3 ⁄ 被围观 1,775 views+   指针数组: 在一个数组中,如果它的元素全部都是指针

c二维数组名与指针的指针之间的关系

问题描述 c二维数组名与指针的指针之间的关系 int arr[3][4]; 书上说arr是指针的指针. 但是有点问题,为什么arr和arr[0]的值是一样的. 如果它是指针的指针的话,那么arr应该在一个内存空间1中存着arr[0]的地址,这个内存空间也有自己的地址. 但是这个内存空间的地址却与内存空间中存着的地址是相同的... 解决方案 arr的值本身是二维数组的首地址,它存储的内容也是数组的首地址 printf("%p %p ", arr, *arr);// 这2个值一样,它存储的

c++的问题-指针和二维数组的用法

问题描述 指针和二维数组的用法 int *s for(i=0;i<5;i++) for(j=0;j<5;j++) cout<<s[i][j];//error想请教各位程序员哥哥这个要怎么改啊? 解决方案 楼上的就行了,int (*s)[5][5] 也可以吧. 解决方案二: 虽然是二维的数组,其实指针的指的是第一行第一列,所以*s[i]就成了一个一维数组的指针,在c++里面你还可以试试引用,同时理解指针. 解决方案三: 首先,s在此处定义为一维,二维引用会导致错误.其次,对于s,没有