结构体变量名表示什么

C语言 码拜 9年前 (2016-06-05) 1994次浏览
一般类型如int,char,float等定义的变量a,那么调用a时用的就是a的值,而结构体变量呢?书上说结构体变量名不是结构体变量的首地址,为了测试调用结构体变量名是什么,本人写了个小程序

#include<stdio.h>
typedef struct{
	char name[20];
	int value;
}Student;
int main()
{
	Student a={"abc",1};
	printf("%d %s %d\n",a,a.name,a.value);
	printf("%x %x %x",a,&a.name,&a.value);
	return 0;
}

然而第一个输出结果后面两个值为null和0,与预期的不符合,本人本以为后面两个会输出abc和1的,然后本人逐步修改,发现把前面输出的a去掉,让它只输出两个值,这回正确了。
第二个输出一样,加上a后面两个就是0,去掉就是正常的地址,这是为何呢?
直接调用输出结构体变量到底是什么意义?或它根本没有意义?
以下是测试图结构体变量名表示什么结构体变量名表示什么结构体变量名表示什么结构体变量名表示什么

解决方案

10

%x 是输出整数值的格式,所以会把结构体变量a当作一个整型值,结果就是强制转换a的前4个字节为整型值, 原因是name里的指针地址是递增的,而变量的存储方式是低字节序的,所以int的16进制值是636261,接着是会把接着的2个整型值(分别是4个字节,name有20个字节)输出,0,0, 编译器会把a当作一个变量的集合,而不是一个单独的变量.

#include <stdio.h>
#include <iostream>
typedef struct{
    char name[20];
    int value;
}Student;
 
int main()
{
	// a=0x61,b=0x62,c=0x63,0x0,0x0,,,,
    Student a={"abc",1};
    printf("%s %d\n",a.name,a.value);
    printf("%x,%x\n",&a.name,&a.value);
    printf("%x,%x,%x\n",a);
    std::cout << &a << "," << &a.name << "," << &a.value << std::endl;
    return 0;
}
abc 1
28fee8,28fefc
636261,0,0
0x28fee8,0x28fee8,0x28fefc

10

printf 输出结构体 就是整个结构体复制堆栈中,起码现在是这么做的
结构体在内存是什么样子,在堆栈中也还是什么样子。
可能唯一的差距,就是结构体尾部,补上多少字节。
结构体中字符串数组,就是把字符序列,按照对应的格式输出
#include<cstdio>
using namespace std;
int main()
{
struct data{
char a[4];
int b;
};
data d{“abc”,10};
printf(“%#x-%#x\n”,d);//%x当作整型输出,大小端输出是不同的
printf(“0x%08x-0x%08x\n”,d);//

return 0;
}
///输出
///0x636261-0xa
///0x00636261-0x0000000a


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明结构体变量名表示什么
喜欢 (0)
[1034331897@qq.com]
分享 (0)