c语言对数组名取地址
A. c语言中数组名和对数组名取地址一样吗
值是一样的 但是类型不一样
值都是数组的起始地址
但类型不同,如int a[10];
a的类型 是int *型。
而&a类型 是int **型。
这在赋值 自加等操作中 就会产生不同结果。
B. c语言中,对一维数组名取地址
准确的说法,是变成了二级指针。
而二级指针,是指向指针地址的指针,变相相当于一个第一维度只有1的二维数组。
其中的根源,在于C语言中,声明一个数组其实相当于申请了一个定长的指针(存储位置不同,使用上还是有区别的),你可以将数组名当做指针使用,而反过来,也可以将一个指针,以数组的方式合法访问其成员。而二维数组的声明后,A[1][3],之后A[0]是一个一维数组,同样A[0]保存的,也是这个一维数组的地址,A保存的是A[0]的地址,和二级指针相同。
C. C语言中 用scanf函数输入字符串数组,取地址符&是不用输的,如果输了取地址符算错么 ,或者含义不一样么
不一样。
C语言的字符串为数组形式,而数组的名称可以表示纳慧其地址,故对字符串输入不需要加地址符。而单独的字符、整型变量等的名称不能直接表示地址,故需要加地址符。
数组名就代表了该数组的地址。整个数组是一块连续的内存单元,数组名所代表的地址为第0个元素的地址,c就代表c[0]的地址。
设数组c的首地址为0X2000,也就是说c[0]地址为0X2000,则数组名c就代表这个首地址。因为c已猜谈经表示地址,所以在c前面不能再加取地址符&穗茄碰。
字符串数据类型是建模在形式字符串的想法上的数据类型。字符串是几乎在所有编程语言中可以实现的非常重要和有用的数据类型。
(3)c语言对数组名取地址扩展阅读
为了避免这种情况,可多设几个字符数组分段存放含空格的串。程序可改写如下:
#include<stdio.h>
intmain()
{
charstr1[20],str2[20],str3[20];
printf("Input string: ");
scanf("%s %s %s %s",str1,str2,str3);
printf("Your string: %s %s %s %s ",str1,str2,str3);
}
运行结果:
Input string: C C++ Java
Your string: C C++ Java
D. C语言关于字符串数组取地址的问题。到底要不要&呢
格式"%s"输入字符串到字符数组不需要加取址符&
E. c语言求助!知道数组首地址怎么求出数组元素地址
单维数组名就是首地址,多维数组名就是第1维的首地址,因此取首地址,可以把数组名赋给对应的指针变量,或取索引为0的首个元素地址赋给对应的指针变量。举例:
单维
int
arr[10];
int
*
p
=arr;
或
int
*
p
=&arr[0];
二维
int
arr[10][10];
int
(*p)[10]
=arr;
或int
(*p)[10]
=
&arr[0];//
取第一维地址
int
arr[10][10];
int
*
p=
&
arr[0][0];
//
取多维中的首个元素
F. 关于C语言中对数组取址的问题,详见补充:
对于一个数组来说,数组名是一个地址常量
并不是说是一个地址常量就没有地址(也就是存储常量的存储单元)
当程序没有被调入内存时候,是由三部分代码组成的,依次是二进制代码区(text segment),已经被初始化的静态或者全局变量区(data segment),没有被初始化的静态或者全局变量区(bss segment),常量都是存放在data segment区
当程序被调入内存之后,就在三部分的基础上又被分配了堆区和栈区,栈区用来存放临时变量,参数和返回值等临时的变量
就相当于我们定义char *a="12345",我们都知道这里的“a”是main()中定义的一个指向字符串“12345”的指针,那么“12345”是存放在哪里的呢,就是存放在data segment区的,而“a”变量本身确实存放在程序调入内存后被自动分配的栈区
强制转换的本质上是不改变存储单元中的01代码组合的,只是告诉编译器这个单元的数据将要被作为什么数据处理,例如一个指针变量占据4字节,一个int变量也是四个字节,我们就可以把int强制转换成指针的,需要的时候再把指针转换成int,输出int型结果时是不发生变化的
在这个题目中,“a”是一个数组名,也就是一个地址常量,这个常量存放在data segment区,“&a”取了“a”的地址,也就是一个指向“a”的指针,所以第三个语句是把指向“a”的指针进行了强制转换,第一个语句直接转换的“a”,第二个语句强制转换指向“a[0]”的指针