C语言中有一数组a[3][4],对其强制转换int *a;那么这个数组是不是变成一维数组了?

如题所述

他本身还是二维数组,但可以将强制转换得到的指针当一维数组来处理。

比如:

#include "stdio.h"
int main()
{
 int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
 int *p=(int *)a;
 int i;
 for(i=0;i<12;i++)
  printf("%d ",*(p+i));
 printf("\n");

}

指针变量p就可以当成一维数组来处理,但a还是二维数组。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-05-23
不是,它仍然是二维数组。今天你是不是提了个问题,我回答了,我就是那么写的。
查了一下,看来你跟他不是同一个人。
这个还真不好解释,不过谭浩强的书里说的很清楚了,要不你在翻翻?
本着负责任的态度,俺详解,楼主稍等。..
a[3][4]实际上编译器为它分配了12个连续的int类型的内存单元(注意连续两个字);我们假定数组的起始地址是100(实际上是随机的),那么,a[0]=100,a[1]=100(起始地址)+4(int类型的大小)*3(个元素)=112;类似的:a[2]=124...
如果建立一个指针,int *p=(int *)a;只是把a的首地址给了p。于是,p+3与a[1](a[1]与a[1][0]实际也是相等的) 实际上都指向同一个内存单元,即112,同理,p+4=a[1][1]=116.
鄙人不善言辞,不知这样你懂不?
要不打个比方:
有一个M层的楼房,每层有N个房间,比如11层2号,门牌号可以写成:
1)1102,这是p指针的写法
2)11,02,这是数组的写法
显然,无论那种方法,你都能找到房间,而楼的结构不会因为你的写法而发生改变。
第2个回答  2013-05-23
不知道你的强制转换是什么意思
(int*)a 在C++中的强制转换着这样儿的,但是a本身就是指针,你这样儿强制转换时不会有实际变化和操作的。你可以debug一下,如果你这么写了,那么这一步是直接跳过的。
如果你所谓的强制转换时 int *b = *a; 那么这个不是强制转换,这个是获取a数组的指针,然后赋值给b,只不过首地址一样而已,但是b和a指针的类型不同。
第3个回答  2013-05-23
数组,不管是一维还是二维的,都是连续一片内存空间,所以本质没有区别

求问c语言大神: int a[3][4] 那么a,*a,&a是什么类型?有什么区别?
a是表示二维数组的首地址,其值相当于 &a[0][0] 本身是常量指针 不能改变其值。a是行的首地址 也就是&a[0] 如果你把(*a)+1 那么值就是 &a[1]&a值和a一样,但意义不同,a表示数组首地址,a+1就变成第二个元素地址(int 每个元素地址相隔4)&a表示整个数组,&a+1就直接...

c语言中,数组名的前面加*, 如a[3][4]; *a输出的是什么结果
由于a[3][4]是个二维数组,数组名是数组的首地址,也是一维a[3]的首地址,也是一维第一个元素a[0][0]的首地址,因此a a[0] a[0][0]三个的地址是相同的,那么*a在这里代表什么呢,*在这里代表的是取值符,而不是指针符号,由于a是个二维数组,*a代表的是取第一维的首元素,而这里...

c语言中inta[3][4]什么含义啊?
int a[3][4]={{3,4},{2,8,6}} 最终数组存储情况:数组的下标是从0开始的 所以a[2][0]=0

设有C语句int a[3][4];则每次移动过a数组一行元素的指针变量定义形式是...
设有C语句int a[3][4];则每次移动过a数组一行元素的指针变量定义形式是 a) int *p p的引用b) int **p p的引用的引用c) int (*p)[4] p的引用之后形成的数组是选C 因为 移动a数组一行,就是指: 二维数组 ,第一索引代表行,第二索引代表列int (*p)[4] : p的引用(索引...

int *a[3][4]是什么意思
int **a[3][4]是双指针类型的2维数组,int *a[3][4]是指针类型的2维数组,二维数组本质上是以数组作为数组元素的数组,即“数组的数组”。

请教C语言
形参数组和实参数组之间并不是值传递,而是共用同一段地址,所以在函数调用过程中如果形参的值发生变化,则实参的值也跟着变化。 4)指向多维数组的指针和指针变量 以二维数组为居多。假设定义了一个二维数组a[3][4],那么 a代表整个二维数组的首地址,也代表第0行的首地址,同时也是第0行第0列的元素的首地址。a +...

C语言中,定义一个int a[3][4],如果定义一个指针指向这个数组呢
int a[3][4]的类型是int [3][4],你要定义一个指针指向它,那么首先它得是个指针,int*p,然后指向这个数组,不能写int*p[4]这样写的话p就是个指针数组了,因为p是变量,而[]的优先级要高于*,所以只能写作int(*p)[4];

C语言 main() {int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23},(*p...
输出结果为60。简单说p和a是一个东西。也就是说把p换成a结果也是一样的。具体解释一下:二维数组的结构是这样的:a[3]这个第二维数组记录的是第一维数组的开始地址。即,a[0]的值和(&a[0][0])的值是一样的。a[1]的值和(&a[1][0])的值是一样的等等。因为a值赋给了p的原因,...

假如有二维数组定义为int a[3][4];且有p=a;则p+1表示的是什么?
在c语言中,数组名是数组首个元素的地址,即: a=a[0]。p=a,即p=a[0];所以:p+1=a[0]+1=a[1];

c语言的问题 int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; int (*...
int (*ptr)[3]=a这句,将a的首地址赋值给了ptr,ptr表示的是指向一个含有三个Int的数组的指针,((ptr+1)[2])等价于*((ptr+1)+2),等价于*(ptr+3),这表示从数组a的首地址向后移动3个单位,每个单位为一个含有3个Int的数组,所以一共向后移动了9个单位,即得出运行结果10!要想正确...

相似回答