程序猿之---C语言细节21(#define和typedef区别、结构体细节)

主要内容:#define和typedef区别、结构体细节

#include <stdio.h> 

#define INT_D int*
#define CHAR_D char
int main()
{
	/*#define 与 typedef区别*/
	typedef int* INT_T;
	typedef char CHAR_T;

 	INT_T a,b;   // a、b都为int型指针
 	INT_D c,d;   // c为int型指针、d为int整型 

 	unsigned CHAR_D e;   // #define的类型定义可以类型扩展
//	unsigned  CHAR_T f;  // 这句是错误的,typedef重定义类型不能加类型扩展 

 	/* 结构体细节 */
 	//测试1
 	struct foo{
	 	int foo;
	 } foo;  // 最后面的foo是结构体foo声明的一个变量
//	 foo test;  // 直接这么定义一个结构体是错误的
	 foo.foo= 1; // 结构体名可以和内部变量名一样
	 printf("foo = %d\n",foo.foo);

	 //测试2
    typedef struct fun{
    	int fun;
    }fun;
	fun fn;    // 这时可以定义

/*
	小结:
	1、不要为了方便起见对结构体使用typedef,这样唯一好处就是你不用写struct,但是这个关键字
	可以向你提示一些信息,不应该省掉
	2、typedef用在数组、结构、指针以及函数的组合类型;可移植类型,当你需要一种至少20比特的类型时,可以进行
	typedef操作,这样代码移植到不通平台,要选择正确类型如short、int、long时,只需要对typedef进行修改,而不用对
	每个类型修改 

*/
	return 0;
}

输出:

时间: 2024-10-10 16:47:41

程序猿之---C语言细节21(#define和typedef区别、结构体细节)的相关文章

程序猿之---C语言细节24(段错误、类型提升、sizeof &#39;A&#39;)

主要内容:段错误.类型提升.sizeof  'A' #include <stdio.h> int main() { union test{ char a[10]; int b; }u; int *p = (int *)&(u.a[1]); // 没有引起总线错误 *p = 17; printf("%d\n",*p); #if 0 int *q = 0; // 引起段错误,在linux中运行可看到段错误,在windows下运行时直接出错 *q = 1; #endif

C语言开发函数库时利用不透明指针对外隐藏结构体细节

1 模块化设计要求库接口隐藏实现细节 作为一个函数库来说,尽力减少和其调用方的耦合,是最基本的设计标准.C语言,作为经典"程序=数据结构+算法"的践行者,在实现函数库的时候,必然存在大量的结构体定义,接口函数需要对这些结构体进行操作.同时,程序设计的模块化要求库接口尽量少的暴露其实现细节,接口参数尽量使用基本数据类型,尽量避免在形参中暴露库内结构体的定义. 2 隐藏结构体的两种方法 以笔者粗浅的认识,有两种最常用的方法,可以实现库内结构体定义的隐藏:接口函数形参使用结构体指针,接口函数

c语言define和typedef区别和使用

define完全可以理解替换,typedef代表别名.听着差不多的意思,那2者区别在哪? 先来个简单例子查看基本使用. //define和typedef区别 #define DB double //替换 define 被替换的内容 替换的内容 typedef double db; //别名 typedef 原来的类型名 新的别名 //typedef需要分号 ,typeof 去掉以后符合语法规则,define去掉就会报错 void main() { //看不出区别 DB d1 = 1.2,d2=1

浅谈c语言typedef 与结构体指针(个人小经验)

 #include<stdio.h> #include<string.h> typedef struct emp{ char sex[8]; char name[15]; int age; }*emp;//这里我们用typedef把emp这个结构体变成了*emp这种指向结构体成员的结构体指针 /*typedef struct emp{ char sex[8]; char name[15]; int age; }pi,*emp;//为了程序的可读性最好不要这样声明*/ int m

【C语言天天练(十)】结构体

引言:数据经常以成组的形式存在.在C中,使用结构可以把不同类型的值存放在一起. 结构的声明有两种 1.struct SIMPLE{ int a; char b; float c; };然后用标签SIMPLE去声明结构体变量. 2.typedef struct{ int a; char b; float c; }Simple;然后用Simple去声明结构体变量.此时Simple是个类型名,而不像上面的SIMPLE是个标签. 结构成员可以是标量.数组.指针甚至是其他结构. 结构成员的直接访问用点操作

C语言中两个相同类型的结构体变量之间是可以相互直接赋值的

C语言中,在相同类型的变量间赋值时是直接内存复制的,即将他们的内存进行复制,而两个同类型的结构体变量属于同一种变量,所以赋值时是按照他们的内存分布来直接拷贝的.所以,在C语言中两个相同类型的结构体变量之间是可以相互赋值的.但是要注意指针的浅层复制问题. 下面是一个简单的验证代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdlib.h> struct test

程序猿之---C语言细节29(#define宏大小、空结构体大小、柔性数组不知道你见过没)

主要内容:#define宏大小.空结构体大小.柔性数组 一.#define宏大小 见例子 二.空结构体大小 根编译器有关 三.柔性数组 不常用,可看看 #include <stdio.h> #define N 4 #define STR "abcd" int main() { struct student { }stu; printf("N = %d\n", sizeof(N)); printf("num 5 memery = %d\n&quo

程序猿之--C语言细节15(预处理命令细节#error、运算符#和##、__FILE__、__LINE__)

主要内容:预处理命令细节#error.运算符#和##.__FILE__.__LINE__ #include <stdio.h> /* 包含这个头文件,并不是将其所有函数都链接进程序*/ /* ##运算符 */ #define MK_ID(n) i##n /* 表示将两个记号连接 */ int MK_ID(1), MK_ID(2),MK_ID(3); /* 预处理后变成int i1,i2,i3;*/ /* 定义多个type##_max函数,函数返回类型和参数类型用define决定 * 如GENE

程序猿之---C语言细节9

主要内容:宏定义.max(a,b)宏定义细节.大小端判断.(int&)a什么意思 #if 1 #include <stdio.h> // 注意空格 #define F (x) ((x) - 1) // F代表后面 #define F(x) ((x) - 1) // F(x)代表后面 #define T1 struct type* T1 a,b; // 使用上面在定义多个变量时达不到目的,被解析为struct type* a,b; a为指向结构体的指针,而b被定义为一个结构体 // 经典