c语言 取结构体地址
c语言 取结构体地址,结构体赋值,对用不用取地址符有些困惑?

芝士的草原
转载
关注
10点赞·2025人阅读
满意答案
vhjkjkol
20141115
采纳率:56% 等级:7
已帮助:510人
从本质上来说,stunum、stuname、stuscore
都是变量,变量有两部分构成,即变量地址和变量的内容,直接写变量就是取它的内容。
scanf语句是将输入的数据存入地址中,所以scanf()里的后半段里应该写地址,因而要在stunum前加取地址运算符“&”。
stuname是数组名,数组的数组名里的内容就是该数组的首地址,简而言之,stuname就是地址,所以不用加“&”。
而之所以stuname可以直接写而float数组stuscore[]要一个一个赋值,是因为
stuname是字符数组,字符只占一个字节,即stuname[0]和stuname[1]之间无空隙,输入字符串,程序会将一个个字符填入字符数组。
而float型占4个字节(32位机),这样stuscore[0]和stuscore[1]间就会有空隙,比如说你输入两个数字,一个占1个字节,可能第二个数字就写在了stuscore[0]里面,在输出时只能输出stuscore[0]而无法输出后面的数。此外
,还有可能就是一个数字一半在score[0],一半在score[1],系统就会报错并关闭程序。所以float、int等超过一个字节的不能像char型数组那样直接读取,只能一个一个取地址进行赋值
你可以用sizeof来看各种数据所占字节数。用法:
inti;
i=sizeof(char);
printf("%d",i);
输出的就是char型所占的字节数了,char可以改成int、float或是你所定义的结构体。
指针指的是内存地址,是内存中的一个内存区块的地址编号;
指针变量就是一个变量,这个变量本身要存储在内存中,指针变量所在内存中存储的就是这个指针变量所指向的地址;
指向指针的指针变量:本身也是指针变量,此变量指向的地址中存储的还是地址;
例如给的代码中,p是指针变量,p表示p中存储的地址所指向内存空间;a=&p表示把p这个指针变量所在的地址传递给a;
若
i
所在内存地址编号为x1004;p所在内存地址为x1100;a所在内存地址为x1200;
则p=&i表示吧x1004这个地址存到p所在的x1100内存位置中;
a=&p吧x1100这个地址存到a所在的x1200内存位置中。
首先,你定义了一个指针a,这个指针是一个指向整型变量的指针。
vol函数的参数是一个二级指针,是指向指针变量的指针。
vol(&a)的意思是将指针a的地址传递给vol的二级指针a。在vol函数中,a是一个二级指针,它指向的内容是主函数中定义的指针。
你这里容易混淆,假设这样:int a;
vol(&a);
调用vol的函数
void vol(int b){}
实质上是b->a->int变量
明白了么?就是将a的地址赋值给b了。b就是二级指针。a是一级指针。
补充:本来讲解完了,我就不想多说了,但是看了楼下这位,啊,现在是楼上那位自由的发言,我十分不解。不知道其所云何物。
首先,定义的指针a是一个指针类型的变量,它存储的就是一个地址啊,这个地址就是你所申请的那100个整形空间的首地址。
其次,你在这100个空间中的第三个赋值为3。
然后将a指针的地址传递给参数b,这个b是一个指向指针的指针变量,它存放的是指针a的地址。因此,b就指向了指针a,也就指向了指针a指向的首地址。
再次,你打印的是b[0][0],在主函数中并未赋值的a[0],当然是没有值的。
这个关系,我想任何C语言的学者都不会否认吧。那就是b指向指针a,指针a指向了你所申请的100个int空间的首地址。就是这样的简单关系啊。不知道楼上 自由 所云?!
问题补充:我再说详细一点吧,
void vol(int b)//为了不混乱,我把a改成b
{
b=new int[10];
(b)[0]=100;
}
补充回答:b在局部函数vol中申请了10个整型空间,将此空间的首个元素存储为100实质上a就指向了这个整形空间,并且指向100但是请注意,参数传递实际上是参数赋值的过程,就是说相当于int b = &a。所以b申请了空间,a自然也就有了空间,也指向100你的这个函数说明借由vol函数为a申请了空间并赋值。
例如,char a='c';
char p=&a;
如果想知道指针p的地址,c/c++直接用 printf("%x\n",&p);即可
C++还可以用cout<<&p<<endl;
&做取地址符,后面直接加上变量名即可知道某个变量的内存地址
p就是一个双重指针啊,意思就是说这个指针变量里面放的是一个指针的地址(一般的指针变量里面放的是一个变量的地址),这么说不知道你明不明白。
通过指针变量获得地址值:
int
p;//双重指针
int
q;//普通指针
p=&q;//将指针q的地址赋值给p
通过标准函数获得地址值:
int
p;
p=(int)malloc(nsizeof(int));//动态创建n个int类型的指针变量空间
其实说白了双重指针就是二维数组的头指针,数组的每一行的开头就是那一行所代表的一维数组的指针,二维数组头指针就是每一行的头指针的地址数组。
哇
我自己都觉得指针这个东西好绕。。。。不过多用就明白了。
这是正确的。先看一下解释吧,变量的指针就是变量的地址。存放变量地址的变量是指针变量。即在c语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个变量的地址或称为某变量的指针。
可能有些难以理解,再附一段程序,
#include
#include
int main()
{
int a=10;
int p;
p=&a;
printf("the pointer p address %x\n",p);
printf("the pointer p value %d\n",p);
return 0;
}下面是运行结果,可以看到第一行输出了指针数据p,也就是变量a的地址。采用十六进制显示。第二行输出了目标标量a的值,也就是10。这里用存取内容运算符''对目标变量a读写数据。
解释的不知道能不能懂,可以自己多看一些别的书,可能有更好的解释吧
C语言里面的地址实际上就是一个内存单元的编号,计算机一般是以一个字节为最小的存储单元的,每个字节就给它编一个编号,这个编号就是这个字节的地址,这个编号也就是地址是具有唯一性的。指针指向一个变量的地址,这个类似于,通过知道房间号就可以确定这个房间的具体位置是一样的道理,这个房间编号就是房间的地址。
因为指针变量b尚未赋值,就访问它指向的内容,所以指令b=314;是失败的。
给指针赋值语句是这样的:
b=&a; // 也就是你程序中注释掉的那行
给指针指向的内容赋值语句是这样的:
b=314; // 前提是b必须先赋值
读取指针指向的内容的语句是这样的:
x=b; // 其中x是一个float类型的变量,并且前提是b必须先赋值
以上就是关于定义结构体指针变量要取地址符吗全部的内容,包括:定义结构体指针变量要取地址符吗、c++指针: 储存 “指针地址” 的 地址是什么、指针 取地址符 传参等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)