⑴ 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找到首地址,然后逐个输出数组中各个字符直到遇到字符串终止标志'