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

c语言数组的地址跟首地址的关系

发布时间: 2023-01-05 03:59:22

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语言中,字符数组的首地址字符指针的地址也是第一个字符的地址吗为什么不一样

字符串常量的地址是字符串保存在内存的一组地址。字符数组的首地址代表着该字符串第一个元素的地址。
字符指针是指向字符类型的指针。字符指针并没有地址,当定义一个字符指针变量后,这个变量便有了自己的地址,字符指针变量同时保存着某个地址,这个地址也可以指向单个字符元素,也可以指向字符串。
如:
char
a;
a=getchar();
char
*p;//变量p本身有一个地址.
p=&a;//p保存了变量a的地址,也就是说p指向了a.
同样地,
char
a[20]="english";
char
*p=a;//p保存了字符数组的首地址,也就是说p指向了该数组的第一个元素。
求赏分~

⑶ c语言数组地址指向首元素吗

C语言数组名,就是数组的首地址.
数组的首地址,就是首元素地址.
所以
C语言数组地址指向首元素是正确的.

int
a[N];
a的值
就是&a[0]

⑷ c语言,数组首地址的地址和首地址的内容居然是一样的,看懂了就进来看看吧

理解这个很重要,当你理解之后你就会发现设计C语言的大师们是多么的聪明,这些设计非常利于C语言书写的简洁
a与&a都是指针,指针有两个要素
第一个是地址值,也就指向的位置,你打印出来的就是地址值,a与&a的地址值是一样的
第二个是类型(所指向的数据类型),a指向数组第一个元素,&a指向数组a,a+1后的地址值会偏移一个元素的长度,&a+1后的地址值会便宜一整个数组的长度,所以a与&a类型是不一样的

关于指针与数组的关系,理解之后对你写代码质量会有很大的帮助,当然一开始理解起来会有难度,有一句话说的好:在C语言中只有一维数组(N维数组的元素是数组),数组名作为指针时永远指向第一个元素,如
数组a[3] ,*a = a[0],
数组a[3][4], *a = a[0],只不过这时候a[0]又是一个数组,这时候a[0]又是指向它自己元素的第一个元素,又有*a[0] = a[0][0].
这种方式可以推广到N维数组,所有数组直接对数组名取地址(如&a)得到的指针指向该数组,而不是指向第一个元素,注意这点区别哦,理解了我上面所说的,就知道了

还有对你的疑问说说我的看法
“arr表示的是数组的首地址”:没错,arr就是指向第一个元素的指针
"&arr表示的是数组的首地址的地址":这句话不对,我更倾向于把&arr理解为指向数组arr的指针

“arr相当于一个指针, 我现在直接用printf输出arr相当于输出了arr中储存的内容(不是输出以该内容为地址的变量),其结果居然与arr的地址是相同的,这怎么可能。”:

arr只是一个符号,本身不是变量不存在存储内容的说法

⑸ C语言,数组名与数组第一个元素的关系

首先,你的老师讲“一维数组名是个指针常量,它存放的是一维数组第一个元素的地址”,这个有点问题,数组名本身就代表这个数组的第一个元素的地址,不能说“它存放的是一维数组第一个元素的地址”,a有指针的语法,但它并不是指针,它就代表它本身所处的地址,a就是&a[0],这个地址内存放的是a[0],也就是你放进去的1。
至于&a,这个就有点讲究了,在早期的c语言标准下,这个是不合法的,但是对一个数组取地址不合法有点说不过去啊,所以后来的c标准(具体哪一年不记得了)就允许对数组取地址,但含义不同了,&a在数值上和a以及&a[0]是相同的,但&a的类型是个int(*)[5],是个一维数组指针,相对于a提升了一级

⑹ 数组首地址,哪个表示数组首元素地址

数组首地址是数组的起始地址.
C语言中, 数组名代表的就是数组的首地址
同时 第一个元素的地址, 也是首地址.
多维数组下, 任意一维的第一个元素地址 都是首地址的表示方式.

⑺ c语言中什么叫首地址

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

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

int a[10];

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

int a[10][10];

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

⑻ C语言中,数组在内存中占一片连续的存储区,由什么来代替它的首地址

C语言中规定,数组名就代表了该数组的首地址。

整个数组是以首地址开头的一块连续的内存单元。如有字符数组char c[10]。设数组c的首地址为2000,也就是说c[0]单元地址为2000。则数组名c就代表这个首地址。

因此在c前面不能再加地址运算符&。如写作scanf("%s",&c);则是错误的。在执行函数printf("%s",c) 时,按数组名c找到首地址,然后逐个输出数组中各个字符直到遇到字符串终止标志''为止。

(8)c语言数组的地址跟首地址的关系扩展阅读:

数组的表示方法:

数组元素是组成数组的基本单元。数组元素也是一种变量, 其标识方法为数组名后跟一个下标。下标表示了元素在数组中的顺序号。

数组元素的一般形式为:数组名[下标] 其中的下标只能为整型常量或整型表达式。如为小数时,C编译将自动取整。

例如,a[5],a[i+j],a[i++]都是合法的数组元素。数组元素通常也称为下标变量。必须先定义数组, 才能使用下标变量。在C语言中只能逐个地使用下标变量, 而不能一次引用整个数组。

⑼ C语言,数组名与数组第一个元素的关系

数组是多个元素的集合,而其第一个元素只是它的一个部分


当我们定义一个数组时,要用到方括号修饰符, 如

inta[10];

这也就决定了它的类型为int [10],但其元素的类型却为int


区别:

而C中的指针和数组实际上十分类似(但数组的指针为常量),所以当你尝试用整型(若要用printf完整输出应该用“%ld”格式化)的格式输出一个数组时,一般会输出一个-9223372036854775807 ~9223372036854775807的整数,其实质是数组的起始位置的指针。(注意,输出的范围根据cpu的位数而不同,以上为64位输出的结果)

而当你用a[0]来使用第一个元素时,其类型为int


关系:

在区别中已经提到,指针和数组十分类似,也就是说可以用用于指针的一元运算符”解引用“(*)来获得一个数组的第一个元素。

也就是说,一下两个表达式是等效的

a[0]
*a

那么同理,我们也可以用“取地址“运算符(&)来获取第一个元素的地址,也就是数组的地址(注意,这里的等号不是赋值语句,只是表示左右两个表达式等效)

a=&a[0]

⑽ c语言中起始地址和首地址有什么区别

本质上,起始地址和首地址没有区别,对同一个数组来说,它们是同一个地址。
其实这两个说法没有很明确的概念,只是按照惯例,经常会说:
数组名,是数组在内存中连续存储单元的首地址
数组的指针,是数组的起始地址
只是按照数组方式说明和按照指针方式说明罢了,如果非要说有区别,就是数组方式访问和指针方式访问的区别,a[i++]的访问不会改变a的地址,但如果 *p=a; p++会修改指针的起始地址。