结构体之理解

结构体

1、结构体成员名可以与程序中名称相同,两者代表不同的对象。

2、结构体变量做函数参数时是值传递。

3、成员的引用形式为结构体变量.成员名结构体指针变量->成员名*结构体指针变量).成员名

4、结构体成员在内存中顺序存放,但是结构体成员的内存分配却不一定是连续的(跟对齐方式有关,详见结构体内存分配分析)。


程序员面试宝典上一道题目

看下面这道题目,找出其中的3个错误,并且写出其输出值。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <conio.h>
using namespace std;
struct S
{
	int i;
	int *p;
	float t1;
	char t2;
	char t3;
};
void main()
{
	S s;
	cout<<sizeof(s)<<endl;					//1  
	int *p=&s.i;
	p[0]=1;
	p[1]=5; 
	p[2]=66;
	p[3]=65;	
	p[4]=67;						//2  

	cout<<&p<<" "<<p<<" "<<*p<<endl;			//3 
	cout<<p[0]<<" "<<s.i<<endl;				//4
	cout<<&p[0]<<" "<<&s.i<<endl;				//5
	cout<<p[1]<<" "<<s.p<<" "<<endl;			//6
	cout<<&p[1]<<" "<<&s.p<<" "<<&s.p[0]<<" "<<endl;	//7
	cout<<s.p[0]<<" "<<*s.p<<endl;				//8

	s.p=p;
	s.p[1]=1;
	s.p[0]=2;						//9
	system("pause");
}

代码注释

//1  根据对齐方式,可以得到所占空间大小
//2  虽然结构体有5个成员变量,但并能表示可以使用指针给5个内存地址赋值,因为每个变量所占空间和使用指针表达出的空间大小不一定相同。例如s.t2在内存中只占一个字节,而p[3]在内存中占4个字节。指针变量p指向结构体变量成员s.i,由于现在程序总共申请的空间大小为sizeof(s),所以当使用指针给未申请的空间赋值时,程序出错。
//3  &p表示指针变量p自身的地址,p表示所指向内容的地址,*p表示所指向的内容
//4  p[0]表示地址(p+0)中的内容,也就是*(p+0)
//5  &p[0]表示地址(p+0*sizeof(int*))
//6  p[1]表示地址(p+1)中的内容,也就是*(p+1)     注:这个“1”并不是1个字节,而是1个int*类型所占的空间的字节数,即sizeof(int*)
//7  &s.p[0]表示指针变量s.p所指向的内容的地址,也就是s.p变量自身所存储的值。即&s.p[0]==s.p
//8  出错,因为此时并未给地址0x00000005赋值,所以不能访问此地址中的内容。
//9 出错,因为s.p[1]=1已经把s.p指向的地址更改为了0x00000001,对一个未作声明的地址直接进行访问会出错。

你可能感兴趣的:(面试,System,存储)