user-0 提问: 结构体变量名表示什么

回复:
user: user-1
content: 楼主的帖子不错，让人彻底明白了结构体的变量名a到底是怎么回事了。其实a就是代表这个结构体整体，按照对齐方法按四个字节一组的方式放入61  62  63  0 , 0  0  0  0,  0  0  0  0, 0  0  0  0,  0  0  0  0,1 0 0 0   当你输出a时你就要写够足够的控制字符比如%d，一个%d输出一组的十进制值，比如第一组 61  62  63  0 （分别代表十六进制的a b c 0）它代表是十六进制整数 636261（变量的存储方式是低字节序的），换成十进制就是我们在控制台中看到的6513249，其他各组依次是0，最后一个是1，后面再输出就是我们想要看到的abc和1了

user: user-2
content: 一般都没谁会对结构体进行整体赋值，但是能不能对结构体进行整体赋值呢？数组是不行的。就像给结构体初始化那样 typedef struct {    uint8 a；    uint8 b； } A; void main（void） {    A a；    a={1,2}； }

user: user-3
content: struct data{     char a[4];     int b;     }; struct data d; printf("%x"，d); 参数传递是这样的 printf 函数调用，为d 在堆栈中，准备一个足够容纳d的内存位置。可以假设为  struct data tmp ； 此时相当于在这里定义一个变量 定义式为struct data tmp=d 完成参数传递。 然后，进入printf函数内部，按照 "%x"格式，解释 这个 tmp  于是 tmp.a 这个数组，被看作 int tmpa; 你可以看作这里有个联合体 union{char a[4];int tmpa;}; 其他字段不是第一个字段，有对齐问题，按对齐处理。 对齐之后，按照 格式串指定的格式一一解析。  这个函数，因为是C的不定参数函数， 只能采取约定的方式处理，参数和格式的是一一对应的关系， 如果你的参数不是对应的，那是调用方违约， 对方检测不了，就只能盲目的按照约定好的方式输出。 所以， 第一参数如何传递， 第二格式 如何解释， 这两个因素，影响最终输出结果。 对结构体来说，没有对应的格式。 这本来就是不正确的。 所以结果也无法预期。 没有任何结果是合理的。

user: user-4
content: 楼主想彻底弄明白的话，参考printf的源代码。 Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\output.c

user: user-5
content: a结构体变量，只能做两种运算，整体引用（赋值，参数传递）或访问成员（点运算—地址方式简化，地址方式）。sizeof(struct <>)=24字节，内存对齐。a+1提示不匹配，&a+1是可以的，&a是int *类型，解析方式明确，a是（struct  <>const）类型 ，自定义，和数组又不同，解析方式按编译器设置。printf不会进行类型转换，如果a是按照24字节解析用整型输出不匹配，但c会执行，结果不确定。具体问题怎么分析，新人不太熟。

user: user-6
content: 结构体变量的值是整个结构体。  printf 处理不了结构体。通过 printf 输出结构体，结果是没有意义的。

user: user-0
content: 引用 1 楼 infoworld的回复:%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  你的回答结合四楼的回答让我明白了，我的理解是，printf语句先把后面的参数列表所表示的值放在临时内存中，然后再按前面控制字符串来输出，而a表示的是结构体整个内容（包括name和value），所以会出现636261，我试了下，在前面加入8个%x时，printf（"%x %x %x %x %x %x %x %x"，a，&a.name,&a.value）,这样a.name,a.value的地址能够正常输出，这和我的理解完全相符。之所以问题中会出现那问题只是控制字符串少了，而不是输出a后影响了a.name,a.value的地址。

user: user-0
content: 引用 4 楼 lm_whales的回复: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 谢谢，"结构体整个复制到堆栈"让我一下明白了

user: user-7
content: 结构体变量名，就是变量名。象int a，一样，只是不能直接输出，直接输出没有意义。取地址要用&，不用钻牛角尖，不直接输出就行了    #include<stdio.h> typedef struct{     char name[20];     int value; }Student;   int main() {     Student a={"abc",1};     printf("%p\n",&a);     printf("%p %s %d\n",&a,a.name,a.value);     printf("%x %x %x",&a,&a.name,&a.value);     return 0; }

user: user-3
content: 和数组不同，结构体变量，现在是可以整体赋值的， 结构体中的数组，在结构体赋值的过程中， 也是可以针对每个元素一一赋值的  不过C还不能用初始化列表赋值。 C++11是可以的，因为C++的结构体和类没有太多不同。

user: user-3
content: 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

user: user-8
content: %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