c11结构体

本文深入探讨了C/C++中的结构体(struct)和联合体(union)的使用,包括它们的大小计算、对齐方式以及如何利用联合体判断大小端。此外,还介绍了如何在字符串中删除特定字符,以及两种筛选素数的方法。

1.

面试问题:typedef define 区别是什么?
typedef自定义类型
/C和C++的区别:
//C:空的结构体,大小不确定,报错
//c++:空的结构体,大小为1个字节
typedef int *PP;//==》由这种变量提升为类型

2.联合体

union sample
{
	short i;//2
	char ch;//1
	float f;//4
	union MyUnion
	{
		char ch;
	};
}s;

3.结构体的大小

struct A
{
	char a;//1
	int b;//4
};//8
struct B
{
	char a;//1+1
	short b;//2
	int c;//4
};//8
//向前对齐
struct C
{
	char a;//1+3
	int b;//4
	short c;//2
	double d;//8
};//24
struct D
{
	char a;//1
	char  b;//1
	short c;//2
	int d;//4
};//8
struct  E
{
	char a;//1+1
	short c;//2
	char  b;//1+3
	int d;//4
};//12
//向后对齐
struct F
{
	int a;//4
	char c;//1
	//int d;//4
	struct F *p;//4
};

typedef struct A
{
	char a;
	int b;
	//struct A bb;//在当前结构体内,不能自引用
}Aa;
//   .:是否为变量         ->:是否为指针
struct B
{
	int i;//不能进行赋值
	struct A Aaa;
	struct A *p;
}Bb;

4.用联合体判断大小端??

bool IsLittle() 
{
	union MyUnion
	{
		short a;
		char ch;
	}uu;
	uu.a = 0x1234;

	if(uu.ch == 0x34)
	{
		return true;
	}
	return false;
}

5.输入年月日,得到今天是今年的第几天

typedef struct Day 
{
	int year;
	int month;
	int day;
}Day;

int Today(Day * pdays)
{
	int today = 0;
	int arr[] = {31,28,31,30,31,30,31,31,30,31,30,31};
	if((pdays->year % 4 == 0 && pdays->year %100 != 0)
		|| pdays->year % 400 == 0)
	{
		arr[1] = 29;
	}
	//1,1
	switch(pdays->month) 
	{
	case 12://12
		today += arr[10];
	case 11://
		today += arr[9];
	case 10://
		today += arr[8];
	case 9://
		today += arr[7];
	case 8://
		today += arr[6];
	case 7://
		today += arr[5];
	case 6://
		today += arr[4];
	case 5://
		today += arr[3];
	case 4://
		today += arr[2];
	case 3://
		today += arr[1];
	case 2://
		today += arr[0];
	case 1:
		today += 0;
		break;
	}
	today += pdays->day;
	return today;
}

6.//3、在第一个字符串中 ,删除第二个字符串中所有的字符。

//函数原型:char *DeleteChars(char *str1,char *str2);
//参数str1:“Welcome hello” 参数str2:“come” 结果输出:“Wl hello”

char *DeleteChars(char *str1,const char *str2)
 {
	 assert(str1!=NULL&&str2!=NULL);
	 int brr[256]={0};//ASCII码有256
	 const char *p2=str2;
	 while(*p2!='\0')//我们可以申请一个数组用来代表这256个字符是否存在于第二个字符串中,
	 {
		 brr[*p2]=1;//把要删除的字母赋值为1
		 p2++;
	 }
	 char *pbegin=str1;//如果有,则标记为1,如果没有则标记为0.同理,我们通过查询,对应ASCII值号下,数组是否为1,来判定是否删除
	 char *pend=str1;
	 while(*pend!='\0')
	 {
		if(brr[*pend]!=1)	//判断pend指向的字母是否在brr中,(在的话删除,)不在继续找下一个
		{
			*pbegin=*pend;
			pbegin++;
			pend++;
		}
		else
		{
			pend++;
		}
	 }
	 *pbegin='\0';
	 return str1;
 }

7. 第四题4、筛选法求100以内的素数。即2的倍数大于1的全部置0,3的倍数大于1的全部置0,4的倍数大于1的全部置0…,最后找出不为0的数字

void Screen()
{
	int arr[N+1]={};
	int i;
	for(i=1;i<=N;i++)//将所有数赋值为1
	{
		arr[i]=1;
	}
	//int i,count =2;
	int count =2;
	 while(count<=N/2) //显然:count不会超过N/2,必能使留下的数全为素数。
    {
        for( i=count+1;i<=N;i++)
        {
            if(arr[i]==1&&i%count==0)//判断是否为素数,如果否将这个值赋值为0
            arr[i]=0;
        }
        for(i=count+1;i<=N;i++)
        {
            if(arr[i]==1)//如果是素数,将i的值赋给count,
            {
                count=i;
                break;//结束for循环
            }
		}
	 }
		for(i=2;i<N;i++)
		{
			if(arr[i]==1)
			{
				printf("%3d",i);
			}
		}
}
void Prime(int n)//法二
{
	int *p=(int *)malloc(n*sizeof(int));
	assert(p!=NULL);
	for(int i=0;i<n;i++)
	{
		p[i]=1;//亮灯
	}
	for(int j=2;j<n;j++)//2  -n之间的素数
	{
		for(int num=2;num<j;num++)//3-n之间能否整除判断j是否为素数
		{
			if(j%num==0)//不是素数
			{
				p[j]=0;
			}
		}
	}
	for(int k=2;k<n;k++)
	{
		if(p[k]==1)
		{
			printf("%d ",k);
		}
	}
	printf ("\n");
}
//栈上的内容函数运行完销毁
<think>好的,我现在要解决用户关于结构体定义和使用的问题。首先,用户提到了C/C++和其他编程语言,所以需要涵盖这些内容。我需要先回忆结构体的基本概念,然后整理不同语言中的定义和使用方法。 首先,结构体在C语言中的定义方式。根据用户提供的引用[1]和[2],C语言的结构体可以通过几种方式定义:先定义结构体类型再声明变量,或者定义时直接声明变量,或者使用匿名结构体。例如,struct关键字后面跟结构体名,然后定义成员变量。还要注意位域的用法,比如指定成员的位数,这在引用[2]中提到过。 然后是C++中的结构体,和C类似,但C++的结构体可以有成员函数、访问控制等,和类相似,默认访问权限是public,而类默认是private。这里需要区分C和C++的不同之处。 接下来是其他语言,比如Go、Python、Rust等。例如,Go使用type和struct关键字,Python可以用dataclass或者namedtuple,Rust使用struct关键字并需要声明字段类型和可能的实现块。这部分需要简要说明,让用户了解不同语言的差异。 在使用方法方面,需要包括如何声明结构体变量、访问成员、初始化、作为函数参数传递等。比如C中初始化可以用花括号,C++还支持构造函数初始化,Go需要按顺序或指定字段名初始化,Python的namedtuple通过参数实例化等。 还需要注意内存对齐的问题,尤其是在C/C++中,结构体的内存布局可能受编译器优化影响,位域的使用可以节省空间。这部分在引用[2]中提到的位域指定成员位数,需要解释清楚。 另外,用户的问题可能涉及结构体的应用场景,比如用于组合不同数据类型,创建复杂数据结构,或者在网络传输中打包数据。需要举一些例子,比如坐标、学生记录等。 需要检查是否有遗漏的语言特性,比如C++中的结构体可以有静态成员、继承等高级特性,但可能用户作为初学者更需要基础内容,所以先不深入。同时确保示例代码正确,语法无误,比如C中的typedef使用,避免语法错误。 最后,生成相关问题,覆盖定义方式、初始化、访问控制、不同语言差异、应用场景和内存布局等方面的问题,帮助用户进一步学习。 总结步骤: 1. 结构体概念和作用 2. C语言中的定义和使用(不同方式) 3. C++中的结构体特点 4. 其他语言中的结构体(Go、Python、Rust) 5. 使用方法:初始化、访问、传参等 6. 注意事项(内存对齐、位域) 7. 应用场景 8. 示例代码 9. 相关问题生成 需要确保每个部分清晰,使用正确的中文表达,避免术语错误。同时按照用户要求,行内公式用$...$,独立公式用$$...$$,但结构体部分可能较少涉及数学公式,所以可能不需要。但如果有涉及,比如结构体大小计算,可能需要用公式,比如内存对齐的计算,不过用户问题可能不涉及,所以可能不需要。但按用户指令,所有数学表达式必须用正确格式,所以如果有的话需要注意。 现在组织内容,确保结构清晰,分点说明,代码示例正确,引用标记正确。比如引用[^1]和[^2]在适当的位置,比如提到C语言结构体定义方式时引用[^1],提到位域时引用[^2]。</think>### 结构体的定义与使用方法详解 #### 一、结构体的基本概念 结构体(Struct)是编程中用于**组合多个不同类型数据**的复合数据类型,可将逻辑相关的数据封装为整体。例如,定义坐标时可组合$x$和$y$值,管理学生信息时可包含姓名、学号等字段。 --- #### 二、C语言中的结构体定义 1. **基本定义格式** 使用`struct`关键字定义,支持三种形式: ```c // 方式1:先定义类型,后声明变量 struct Point { int x; int y; }; struct Point p1; // 方式2:定义时直接声明变量 struct Point { int x; int y; } p1, p2; // 方式3:匿名结构体(仅限C11及以上) struct { int x; int y; } p3; ``` 2. **使用typedef简化** ```c typedef struct { int x; int y; } Point; // 直接通过Point声明变量 Point p4 = {3, 4}; ``` 3. **位域(Bit Fields)** 指定成员占用的二进制位数,节省内存空间: ```c struct Flags { unsigned int is_active : 1; // 占1位 unsigned int value : 4; // 占4位 }; ``` --- #### 三、C++中的结构体扩展 C++中结构体可包含**成员函数**和**访问控制**,默认成员为`public`: ```cpp struct Student { std::string name; void print() { std::cout << name; } private: int age; // 私有成员 }; ``` --- #### 四、其他编程语言中的结构体 1. **Go语言** 使用`type`和`struct`关键字,支持标签(Tag): ```go type Point struct { X int `json:"x"` Y int `json:"y"` } p := Point{1, 2} ``` 2. **Python** 通过`dataclass`或`namedtuple`实现类似功能: ```python from dataclasses import dataclass @dataclass class Point: x: int y: int p = Point(3, 4) ``` 3. **Rust** 结构体需声明字段类型并可附加方法: ```rust struct Point { x: i32, y: i32 } impl Point { fn new(x: i32, y: i32) -> Self { Point { x, y } } } ``` --- #### 五、结构体的使用场景 1. **组合异构数据**:如坐标点、学生档案。 2. **数据结构实现**:链表节点、树节点等。 3. **网络通信**:按协议打包二进制数据。 --- #### 六、代码示例(C语言) ```c #include <stdio.h> typedef struct { int x; int y; } Point; int main() { Point p = {10, 20}; printf("坐标: (%d, %d)\n", p.x, p.y); return 0; } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的sun&shine

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值