如图所示两张图,为什么 当定义为*str[12]时strcpy(str[0],str[1])是错误的;但是当定义为str[12][8]时,strcpy(str[0],str[1])是正确的?
涉及到数据是如何存储分布的。
一个程序在内存中的分布情况如下图所示:(图来自网络,很粗略的图但是可以用来说明)
char *str[12] = {"enter", "number"};
这样定义出来的数据分布情况,str这个指针数组存储在栈区,作为局部数据(如果是在函数内部定义)。若是定义为全局变量则该数据存储在.data区。注意这个数组存储的是指针,而这些指针实际指向的数据才是真正的字符串,而这个字符串是源代码经过编译器分析后,放置在只读数据区.rodata段(因为直接书写的字符串是const类型的,即常量类型的,常量类型不能被修改,下面会解释原因),在图上对应的是.text段(这里是图中被糅杂在一起了,实际上还是有.rodata的)。如果程序访问只读数据区的话,会经过段选择子(硬件的一个部件,类似寄存器的东西)的权限判断,因为只读数据区被填写为只能读不能写,因此执行过程中发生错误,向操作系统进行报告,最后得到一个异常或者说error。导致你执行错误。
而另一种写的方式:
char str[12][8] = {"enter", "number"};编译器分析出来,这个字符串是被定义并放置在栈区,作为局部数据,全局变量则在.data区。这个数组存的就不是指针了,而是字符串实体的数据,这个实体数据被放置在栈区或者.data区,在访问时段选择子发现这个区域是可读可写的,因此能够顺利进行改写而不会产生错误。
以上。
C语言中二维数组行指针是什么
如果把二维数组的每一行看成一个整体,即看成一个数组中的一个元素,那么整个二维数组就是一个一维数组,它以每一行作为它的元素,这个应该很好理解。第一,来详细介绍二维数组与指针的关系。- 首先定义个二维数组 array[3][4],p 为指向数组的指针。若p=array[0],此时p指向的是二维数组第一行的...
C语言函数调用二维数组,指针问题
int (*p)[10]是一个指向数组的指针 数组长度为10 假如定义成 deal(int **p),传参数时要加强制类型转换: deal((int**)a);并且使用p时不能用下标,p[2][3]是错误的,因为不知道p指向的int*型的长度,无法编译成*(p+2*10+3)必须自己写成*(p+2*10+3)来调用 假如定义成 deal...
C语言指针问题
由于二维数组的逻辑结构是一维空间,存储结构是二维空间,因此可以分别按照存储结构和逻辑结构定义指向二维数组的指针.二维数组是按行优先的规律转换为一维线性存放在内存中的,因此,可以通过指针访问二维数组中的元素。如果有:int a[M][N];则将二维数组中的元素a[i][j]转换为一维线性地址的一般公式是:...
C语言程序设计中"二维数组中元素指针的表示"的例题,求详解
⑴ 用指针表示二维数组元素。要用指针处理二维数组,首先要解决从存储的角度对二维数组的认识问题。一个二维数组在计算机中存储时,是按行存储的,即先存储第一行的元素,再存储第二行的元素。当把每一行看作一个整体,即作为一个大的数组元素时,原来的二维数组也就变成一个一维数组了。而每个大数组...
C 语言指针的指针和二维数组的区别?
指针的指针和二维数组完全俩东西,二维数组是 一维数组的一维数组,元素是数组,所以可以隐式转化为int (*)[3],跟int **两回事,扩展到更多维或其它类型也是成立的,只能隐式转化为第一维的元素的指针 补充说明下隐式转化为指针,简单说就是这样(T是任意类型)设有一个数组T a[10];a的类型是“...
c语言二维数组与指针,我想知道为什么*(a+1).与显示中的a+1,所给出的...
一个*是指针 所以ij都是指针 a+1是一个指针,表示第1行的首地址(c中数组时从0开始计数的)在二维数组中,a,a[0],&a[0][0]这三个指针虽然都是a的首地址的值,但是在c中用起来是不一样的 a表示二维数组的首地址 a[0]表示第0行的首地址 &a[0][0]表示第0行的第0个元素的地址 ...
求助:C语言二维数组指针问题
1.对于int **p = a;p类型和a是不同的。p是指向一个指针(指向int类型的量)的指针,a则是指向一个一维数组(含2个int元素)的指针。想要创建相同类型的指针应该用int (*p)[2]; 才行 3.感觉p跟a就同级吧但类型不同 所以其实int **p=a; 两侧的指针的类型是不相同的,只是a的值赋给p而已 ...
c语言中,关于指针int(*p)[4]和int*p指向二维数组a[3][4]初始化的问题...
p指向一个N列二维数组的首地址 p自增1,p指向下一“行”一维数组的首地址 因为p是一个二级指针。所以索引其指向的数据内容需要取二次内容,格式及解释如下:格式:*(*(p+行)+列)解释:其实很好理解,因为p作为二级指针,p++代表的仅仅是行号+1所以格式中*(p+行)就取到了所在行首地址指针(...
C语言中二维数组名是不是可以看作指针数组名?
不可以,二维数组要看做“数组的数组”。(以如下定义为例:int a[4]; int * p;)给你个对于指针和数组的正确理解吧:定义的不同:C 里,指针和数组是不同的类型,不要把数组名看做“常指针”。所以 sizeof(a) 和 sizeof(p) 值是不同的。容易被混淆的原因:a. 都有基础类型。b. 数组...
C语言中二维数组的指针问题
&a[0][0] 也是指0行0列的元素地址 p=&a[0][0] 它的意思的使指针p指向数组a的第0行第0列,而在后面执行p++的时候,就会使指针顺序后移,依次指向 a[0][1] a[0][2]……a[2][2] 的地址;假如:p=a 这是使指针p指向数组a的首行,当你输出*p这个值的时候,它输出的值是a[0...