当前位置:首页 » 编程语言 » c语言首地址移动两位是数组为几
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言首地址移动两位是数组为几

发布时间: 2022-11-01 10:11:23

‘壹’ c语言数组首地址相关问题!!

若a是一维数组名,我们知道*a就是a[0],就是*(arr+0)。因为a是数组的首地址,*a就是取首地址所指元素,就是数组的第一个元素。
同样的道理,a是二维数组名时,*a也是取a的第一个元素,但是此时a所指的元素是一个一维数组,所以,实际上a所指元素是一维数组的首地址。
二维数组a,a是数组地址,指向行;有一个等价关系 a[i]=*(a+i)
a[i]指向列,&a[i]又指向行。

你可以将*和&理解为相反的操作:
a指向行,*(a+i)指向列,*(*(a+i)+j)等价于a[i][j];
就按a[3][4]这个例子来看:3行4列数组a可以理解为a[0],a[1],a[2]这三个一维数组
a[0][0] a[0][1] a[0][2] a[0][3]//第一行a[0][]
a[1][0] a[1][1] a[1][2] a[1][3]//第二行a[1][]
a[2][0] a[2][1] a[2][2] a[2][3]//第三行a[2][]
(数组含有4个元素)构成的二维数组,*a就是a[0],而a[0]就是第0行的首地址,也就是第一个数组的首地址。*(a+i)就是a[i],就是第i行的首地址。

如果现在定义a是字符型数组,输出*a(也就是第一行的首地址)为0000,再输出*(a+1)就是0004,而不是0001,就可以说明a是指向一维数组的指针。

‘贰’ C语言二维数组地址问题

1、&a[0][0]为0行0列元素的首地址,a[0]+n为0行第n个元素地址,那么a[0]是表示0行首元素地址吗?

>>正确, a[0]就是0行首地址.

&a[0]是零行的首地址,实际上行的地址也只有一个,也无所谓0行的首地址吧?

>>&a[0]值上, 是和a[0]相同的, 不过类型不一样. a[0]等效于int *型,实际上是指向一个元素. 而&a[0]是行指针, 指向一行.所以,a[0]+n和&a[0]+n是完全不同的.

+n相当于元素位移了n个位置吗,所以代表第n个元素地址吗?

>>+n取决于原始指针的类型. 如果是a[0]+n 移动的是n个元素.而&a[0]+n就是移动n行了.

然后*(a[n]+m)就表示n行第m个元素了?

>>这句没错. 任何情况下, *(p+n)都等效于p[n]
2、书中写a+n表示第n行的首地址,那是相当于&a[n]吗,a不是表示数组首个元素地址吗,怎么+n不是元素位置改变,却是位移了行?

>>这个上面说过了, 核心在于指针的类型. 二维数组int a[M][N]的数组名a, 本质上是常量的int (*)[N]类型, 也就是数组指针. 移动的时候是整行移动的.

还是a+n表示n行首个元素的地址?为什么

>>同上
*(a+n)与a[n]是等价的,原理是什么,*(*(a+n)+m)怎么也能表示n行m列元素呢?

>>*(a+n)与a[n]等价, 这个是C语言的一个规则. 其本质是, 当编译器遇到a[n]这样的形式时, 实际上是翻译成*(a+n)进行编译的. 这种可以用一个很少见的形式来验证.你定义

int a[4]={1,2,3,4}; 然后输出

printf("%d ", 3[a]);

对, 就是把数组名放进[], 实际上会输出a[3]

‘叁’ c语言数组首地址的一个疑问

你可以把数组名看成一个指针啊,只不过数组名不需要再像指针变量那样用一个内存单元存储其地址。
比如:
int n;
int *p=&n;
这里p就需要另外的空间存储。
而数组名的值就是其地址值,所以a和&a相等;
a[0]的值和a的值放在一个内存单元中,这句话是错误的。a[0]的值是第一个数组元素的值,a的值是数组首地址。而a的值不需要用另外的空间存储。
不知道这样说你懂了没?
数组是复合型数据结构,sizeof操作的结果是数组元素占内存的总的字节数。
a不是一个常量,也不是一个变量,只是一个数组标识符。

‘肆’ C语言数组的地址跟首地址的关系

以下是本人的理解,希望对您有帮助!
1. a是数组的首地址,&a是a[0]的首地址和&a[0]等效
2. 对于int (*p)[4]的理解:首先p是一个指针(隔*近!);是一个什么样的指针呢?是一个指向int型数组的指针。故:p是一个数组指针!

‘伍’ 求助!!C语言 二维数组的指针及首地址问题

若arr是一维数组名,我们知道*arr就是arr[0],就是*(arr+0)。因为arr是数组的首地址,*arr就是取首地址所指元素,就是数组的第一个元素。
同样的道理,arr是二维数组名时,*arr也是取arr的第一个元素,但是此时arr所指的元素是一个一维数组,所以,实际上arr所指元素是一维数组的首地址。
就按arr[3][4]这个例子来看:3行4列数组arr可以理解为arr[0],arr[1],arr[2]这三个一维数组(数组含有4个元素)构成的二维数组,*arr就是arr[0],而arr[0]就是第0行的首地址,也就是第一个数组的首地址。*(arr+i)就是arr[i],就是第i行的首地址。
如果现在定义arr是字符型数组,输出*arr(也就是第一行的首地址)为0000,再输出*(arr+1)就是0004,而不是0001,就可以说明arr是指向一维数组的指针。
希望对你又帮助。

‘陆’ 字符数组循环右移2位。c语言

你是要移动到别一个缓存区里,还是空出左边数组位置来

‘柒’ 为什么c语言的指针➕1是向后移动2位,不是移动4位,一个指针不是4byte吗那应该移动4位才对呀

注意指针的移动不是指的加上指针的大小,另外你的说法也有问题,指针的大小与平台是有关的,与CPU的寻址能力也是有关的,如如果编译32位程序那么指针大小是4字节=32位,如果编译64位程序那么指针大小为64位,因为现在一般编译器所编译的默认为32位程序,所以就有了指针大小一般为4字节的说法,实际指针大小应以编译器中sizeof为准

int *p;
printf("%d",sizeof(p));
然后说到你的问题,指针的移动是指针指向元素的移动,比如指针指向一个整形数组
int a[5];
int *p=a;//p指向数组的首地址即第一个元素
p=p+1;//这时p指向数组的第二个元素,也就是说现在p保存的是数组第二个元素的地址
从这里看出,p的移动是从指向第一个元素移动到指向第二个元素,这里定义int型占两个字节,所以p从指向第一个元素转为指向第二个元素p要越过第一个数组元素所占用的内存空间2个字节,同理,如果数组是char型,p移动一个那么地址变动为1个字节

‘捌’ c语言中什么叫首地址

首地址就是该变量所占的存储区域中的第一个单元的地址。

比如定义一个数组,数组的第一个数的地址就是首地址

int a[10];

那么a[0]的地址就是首地址

int a[10][10];

则 a[0][0]的地址就是首地址

‘玖’ C语言 数组首地址

a为数组名,代表数组首地址
&a 中的&为取地址运算符
结果都是一样