c语言数组取地址
㈠ 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];
//
取多维中的首个元素
㈡ C语言中如何指定数组的首地址在指定的地址
据我所知,创建数组需要2个参数,1是地址,2是分配空间。空间分配是不能重复的,也就是说创建2个数组,这两个数组是不可能重合的,为了防止这种事情出现,所以不能指定地址。而是编译器自动分配,不能人为。
但是可以省去分配空间这个步骤,而是只创建地址,这就是指针的概念。比如int a[12],你若是想创建另一个代替a[12],可以int *p=a;这样,p的值就是a数组的首地址了。int *p =(int*)0x80000;意思就是p[0]的地址是0x80000,创建的时候要确定(int*)0x80000已经分配过了,可以使用了,不然就相当于野指针,容易出错。
㈢ C语言关于字符串数组取地址的问题。到底要不要&呢
格式"%s"输入字符串到字符数组不需要加取址符&
㈣ c语言,关于对数组名取地址
准确的说法,是变成了二级指针。
而二级指针,是指向指针地址的指针,变相相当于一个第一维度只有1的二维数组。
其中的根源,在于C语言中,声明一个数组其实相当于申请了一个定长的指针(存储位置不同,使用上还是有区别的),你可以将数组名当做指针使用,而反过来,也可以将一个指针,以数组的方式合法访问其成员。而二维数组的声明后,A[1][3],之后A[0]是一个一维数组,同样A[0]保存的,也是这个一维数组的地址,A保存的是A[0]的地址,和二级指针相同。
㈤ C语言数组的地址
其实你这个疑问是概念上的混淆,或者说对指针了解上上的欠缺
首先讲int a[3] = {2,3,4};
这里的a是这个数组的首地址,比如定义如:int *p = a;这时如果你进行如下操作:
p++;
printf("%d\n",*p);
结果会是输出2,也就是说p+1相当于数组索引加1,但是像你所问的为什么&a和a是相同的 ,首先要知道他们分别代表什么意思,a:像上面所说的是数组的首地址,做自加运算会根据数组类型来计算偏移量,那么&a是什么东西呢,实际上它也是一个指针,是指向一个具有3个元素的数组的指针,如何理解,看以下定义:
如果你定义int *q = &a;这时编译器肯定报错,绘制出数据类型不一致,那么你这样样定义就没有问题:int (*q)[3] = &a;这时如果你再对q进行++操作,那么加的就不同了,如相面的p++操作后p的值会加4,而这里q++操作后的值会加12,也就是跳过3个数组元素,然而,确实这两个指针的初始值是一样的,只是类型不一样而已,这对二维数组的访问时很方便的,这个你可以参照2维数组得到进一步理解,讲的有点乱,不知道你能不能理解
㈥ 关于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]”的指针
㈦ C语言中 用scanf函数输入字符串数组,取地址符&是不用输的,如果输了取地址符算错么 ,或者含义不一样么
一般变量使用取地址符,是获取其地址,即为指向该变量的指针。
数组名就是数组的首地址,指向该数组的第一个元素的指针,只不过是常量指针而已。所以不用再加取地址符。
要加的话可以如下:
char str[10];
scanf("%s", &str[0]); // 取第一元素的地址,等价于数组名 str
㈧ C语言结构体数组,输出中加取地址符是为什么
取地址符&作为一元运算符,结果是右操作对象的地址。例如&x返回x的地址。地址本身是一个抽象的概念,用于表示对象在存储器中的逻辑位置。
scanf("%d,%d",&x,&y);这里的&x表示x的地址,&y表示y的地址。scanf接收地址,然后把键盘(更确切地说是stdin输入流缓冲区)读入的信息按格式字符串的形式处理后存放到接收到的地址中。对于纯C来说,函数的参数是只能值参而不是变参,函数内部对参数的改变只影响参数本身而不影响调用函数时的实际参数(换句话说函数内部的只是副本)。所以这里不能向scanf传递x本身,需要用地址&x指明需要存放的位置,才能把值存到x中。
输出中使用&,例如printf("%X",&a);
作用就是把变量a的物理地址用16进制的方式输出。
㈨ c语言数组、地址问题请高手解释
定义了数组a,则机器在内存当中给数组a开辟一片内存存储数组a,数组a的元素是顺序存储的,所以说数组a所在的地址就是数组a第一个元素所在的地址,这两个指针(&a,&a[0])其实算是指向同一个地址的,所以打印出来的数值是相同的。
%p应该是64位32进制形式输出,%d是十进制形式输出的。&a[0]跟a其实是一回事,是相等的,所以第一行的第二个数,换算成十进制就跟第二行的第一个数是相等的。0x22FE30=2293296。
㈩ c语言中"&取地址"是什么意思
找到变量在内存空间的位置,对变量进行操作时,会找到该处。