typedef用法总结
typedef与#define之间的差异
1.typedef创建的符号名只限于类型,不限于值
2.typedef由编译器解释,不是预处理器(编译的阶段不一样)
用法
(1) typedef基本数据类型取“别名”
//对变量的类型进行重新定义类型名称
typedef unsigned int size;
typedef unsigned int16 u16;
typedef unsigned int8 u8; //u8 xiaoming 等于 unsigned int8 xiaoming
(2)typedef为自定义数据类型取“别名”
//自定义的数据类型包括:结构体struct name{};共用体unit name{};枚举enum{};
struct students{char sex;char name[120]; //学生名称int ages;
};
struct students std;
//或
struct students{char sex;char name[120];int ages;
} std;
std.name[120] = "xiaoming"
使用typedef 定义
struct students{char sex;char name[120];int ages;
};
typedef struct students std; //别名
std.name[20]="wujunwu"
(3) 数组取"别名"
typedef char arr_name[20];
arr_name ane;
ane[20]="xiaoming"
(4) 指针取"别名"
普通指针
int a=2;
int* pointer;
pointer =&a;
//等于
int a=2;
typedef int* pointer;
pointer p;
p=&a;
//如果a的数据类型是char ,即char a =2;那么,
char a=2;
typedef int* pointer;
pointer p;
p=&(pointer)a; //理解:(pointer)a将a转为(int *)的指针,再取(int *)a指针的地址,再将其赋值给一个pointer类型指针,指针之间的赋值,此时p指针指向(int *)a指针地址
函数指针
typedef unsigned int bool;
typedef bool(*pCopySDMMC2Mem)(int, unsigned int, unsigned short, unsigned int*, bool);
typedef void (*pBL2Type)(void);
pCopySDMMC2Mem p1=(pCopySDMMC2Mem)0xD0037F98;
pBL2Type p2 = (pBL2Type)0x23E00000;
执行的步骤:
第一步:给指针取“别名”
pCopySDMMC2Mem p1;
pBL2Type p2;
第二步:强制类型转换
(pCopySDMMC2Mem)0xD0037F98;
(pBL2Type)0x23E00000;
第三步:给指针赋值
p1=(pCopySDMMC2Mem)0xD0037F98;
p2 = (pBL2Type)0x23E00000;
说明:使用typedef时,typedef并没有创建任何新类型,它只是为某个已经存在的类型提供一个“别名”
typedef中的错误用法
//错误
typedef char* PCHAR;
int strcmp(const PCHAR,const PCHAR); //const PCHAR” 不相当于 “const char*,原因很简单,typedef 是用来定义一种类型的新别名的,它不同于宏,不是简单的字符串替换。因此,“const PCHAR”中的 const 给予了整个指针本身常量性,也就是形成了常量指针“char* const(一个指向char的常量指针)”。即它实际上相当于“char* const”,而不是“const char*(指向常量 char 的指针)”
typedef const char* PCHAR;
int strcmp(PCHAR, PCHAR); //const PCHAR 相当于 const char* ,无论什么时候,只要为指针声明 typedef,那么就应该在最终的 typedef 名称中加一个 const,以使得该指针本身是常量
虽然 typedef 并不真正影响对象的存储特性,但在语法上它还是一个存储类的关键字,就像 auto、extern、static 和 register 等关键字一样。
//错误示范
typedef static int INT_STATIC; //不可行的原因是不能声明多个存储类关键字,由于 typedef 已经占据了存储类关键字的位置,因此,在 typedef 声明中就不能够再使用 static 或任何其他存储类关键字了。当然,编译器也会报错,如在 VC++2010 中的报错信息为“无法指定多个存储类”
上述内容参考了:typedef用法详解
重点解析(指针概念)
引用的概念
首先引用仅仅适用于C++,C无此特性
C语言使用指针
#include<stdio.h>
int change(int *i){(*i) = 100; //数据的赋值
}
int main(){int a = 60;printf("%d\n",a);change(&a);printf("%d\n",a);return 0;
}
gcc xxx.c -o xxx
运行的结果:
60
100
C++使用引用
#include<stdio.h>
int change(int &i){i = 100;
}
int main(){int a = 60;printf("%d\n",a);change(a);printf("%d\n",a);return 0;
}
g++ xxx.c -o xxx
运行结果
60
100
C语言创建链表节点:
#include<stdio.h>
#include<stdlib.h>
struct tree
{int num;struct tree *l;struct tree *r;
};
int createTreeNode(struct tree **p) //此时是指针的地址,注意与指针指向的地址相区分 struct tree *(*p)理解
{(*p) = (struct tree*)malloc(sizeof(struct tree));//p指针指向的地址(*p)->l=NULL;(*p)->r=NULL;return 0;
}
int main()
{struct tree *head=NULL; //head为指向链表第一个元素”**指针地址**“的指针createTreeNode(&head); //此时是指针的地址,注意与指针指向的地址相区分if (head == NULL) printf("is NULL\n");elseprintf("is not NULL\n"); return 0;
}
C++创建链表的节点:
#include<stdio.h>
#include<stdlib.h>
struct tree
{int num;struct tree *l;struct tree *r;
};
int createTreeNode(struct tree * &p) //&p为引用,可以理解为struct tree *(&p)
{p = (struct tree*)malloc(sizeof(struct tree));//p为引用p->l=NULL;p->r=NULL;return 0;
}
int main(){struct tree *head=NULL; //head为指向链表第一个元素“**指针地址**”的指针createTreeNode(head);if (head == NULL) printf("is NULL\n");elseprintf("is not NULL\n"); return 0;
}
指针地址与指针指向的地址
#include <iostream>
using namespace std;
int main()
{ int a = 4;int* q = &a;cout << &a << endl;cout << q << endl; //指针指向的地址cout << &q << endl; //指针本身的地址
}
结果:
0x7ffc1a612b7c
0x7ffc1a612b7c
0x7ffc1a612b80
注:q表示所指向的地址,&q表示取了指针本身的地址
#include <iostream>
using namespace std;
int main()
{ int *p = (int*)malloc(8);p[0] = 1;p[1] = 5;cout << p << endl;cout << p + 1 << endl;cout << &p << endl;cout << "&p[0]: "<< &p[0] <<endl;cout << "&p[1]: "<< &p[1] <<endl;cout << *p << endl;cout << *(p + 1) << endl;
}
结果:
0x55ad6b977eb0
0x55ad6b977eb4
0x7ffc4dec1ad0
&p[0]: 0x55ad6b977eb0
&p[1]: 0x55ad6b977eb4
1
5
注意p与p[0]/p+1与p[1]之间的区别,p[0]等于*p,p[1]等于*(p+1)
&a, (int*)a, (int)&a, (int*)&a四者之间的联系与区别
1.&a:表示取变量a的地址,结果是一个8位的16进制数;
2.(int*)a:表示将变量a转换成指针形式,结果是一个8位的16进制数(此时为指针);
3.(int)&a:表示取变量a的地址,并将该地址数值(16进制数)转换成整型数据(10进制数);
4.(int*)&a:等价于int *p = &a,结果是一个8位的16进制数。
说明:8位的16进制数,系统为32位的系统,也是指针访存的范围:4G(2^32),当系统为64位时,为12位的16进制数,指针访存范围:2的64次方,所以指针的访存范围会随着系统的位数而改变。
typedef用法总结相关推荐
- typedef用法小结
Typedef 声明有助于创建平台无关类型,甚至能隐藏复杂和难以理解的语法.不管怎样,使用 typedef 能为代码带来意想不到的好处,通过本文你可以学习用 typedef 避免缺欠,从而使代码更健壮 ...
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
关于C++中函数指针的使用(包含对typedef用法的讨论) (一)简单的函数指针的应用. //形式1:返回类型(*函数名)(参数表) char (*pFun)(int); char glFun(in ...
- typedef用法(1)
Typedef 声明有助于创建平台无关类型,甚至能隐藏复杂和难以理解的语法.不管怎样,使用 typedef 能为代码带来意想不到的好处,通过本文你可以学习用 typedef 避免缺欠,从而使代码更健壮 ...
- typedef 用法详解
第一部分 基本概念 1.基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字.这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等). 在编程 ...
- C和C++中struct的typedef用法建议
C和C++中struct的typedef用法建议 参考文章(建议先读) 根据参考的文章,总结一下: 情况1 C语言中: typedef struct{ ···: }aaa; 则aaa是struct类的 ...
- Typedef用法(转载)
在C的学习过程中,现在才发现,以前有那么多被忽略的重点:现在是慢慢拾起这些重点的时候,通过百度和博客,我感觉我学到了很多东西,自己只是在别人说的基础上,按照自己学习的过程在这里记录一下,以后有时间回过 ...
- Typedef用法学习
不管实在C还是C++代码中,typedef这个词都不少见,当然出现频率较高的还是在C代码中.typedef与#define有些相似,但更多的是不同,特别是在一些复杂的用法上,就完全不同了,看了网上一些 ...
- Typedef 用法总结
http://www.cnblogs.com/csyisong/archive/2009/01/09/1372363.html 不管实在C还是C++代码中,typedef这个词都不少见,当然出现频率较 ...
- C语言中typedf函数的用法,C语言中typedef用法详解
在C语言中,经常有如下的用法: typedef struct tag{ ...} MyType, *MyPtr; 一旦通过如上定以后,就可以用MyType来定义struct tag结构了. 以 ...
- c语言typedef的用法,C语言中typedef用法总结,看完就能像编程老手一样熟练运用...
请看下文 C语言中typedef关键字应用比较常见,许多C语言初学者对它的用法不甚了解.事实上,我们可以用typedef来定义自己习惯使用的数据类型名称,可以替代自己所熟悉的基本类型.数组类型.指针类 ...
最新文章
- 367. Valid Perfect Square
- jdk 环境配量配置
- 反射机制(1)认识Class类
- Oracle中比较日期大小
- 如何利用CNKI句子检索功能提高研究效率
- opencv进阶学习笔记8:模板匹配
- 实验四 恶意代码技术
- 鸿蒙 电视 安卓,华为鸿蒙2.0来了!打通手机、电视、PC全平台,Mate 40 整装齐发...
- C++ opengl 纹理生成
- css 按钮按下样式
- 湖南电信拨号上网的某个记录资料
- C语言编程 犯二的程度,犯二的程度 - osc_jhl7rojx的个人空间 - OSCHINA - 中文开源技术交流社区...
- 怎么申请注册微信小程序-微信小程序教程1
- 霆智服务器安装Windows系统,无人值守全自动安装windows系统
- Java+MySQL基于Springboot+vue的汉服交流网站#毕业设计
- CodeForces - 298B Sail (思维题)
- 诸葛管理:怎么才能快速提升执行力
- JMETER之察看结果树(只显示报错请求)
- 基于Solidworks的三维光路结构示意图绘制实例演示
- Appium学习3:Android模拟器安装与使用