typedef的用法详解

如何创建平台无关的数据类型,隐藏笨拙且难以理解的语法?
使用typedef为现有类型创建同义字,定义易于记忆的类型名

typedef int size;

void measure(size*psz);

size array[4];

size len=file.getlength();

std::vectorvs;
typedef 还可以掩饰复合类型,如指针和数组。
例如,你不用像下面这样重复定义有 81 个字符元素的数组:

char line[81];

char text[81];
只需这样定义,Line类型即代表了具有81个元素的字符数组,使用方法如下:

typedef char Line[81];

Line text,line;

getline(text);
同样,可以像下面这样隐藏指针语法:

typedef char* pstr;

int mystrcmp(const pstr p1,const pstr p3);
用GNU的gcc和g++编译器,是会出现警告的,按照顺序,‘const pstr’被解释为‘char* const‘(一个指向char的指针常量),而事实上,const char*和char* const表达的并非同一意思(详见C++ Primer 第四版 P112)。
char * const cp : 定义一个指向字符的指针常数,即const指针,常指针。
const char* p : 定义一个指向字符常数的指针,即常量指针。
char const* p : 等同于const char* p。
为了得到正确的类型,应当如下声明:

typedef const char* pstr;

### C语言结构体指针的用法与示例 在C语言中,结构体指针是一种强大的工具,用于间接访问结构体中的成员。通过使用结构体指针,程序可以直接操作内存地址上的数据,从而提升性能并增强灵活性。 #### 基础概念 结构体指针是指向某个特定结构体变量的指针。当声明一个结构体指针时,可以通过该指针访问其指向的结构体实例的各个成员[^1]。为了简化语法,C语言引入了箭头操作符 `->` 来替代传统的解引用方式 `(*pointer).member`[^2]。 以下是关于如何定义、初始化以及操作结构体指针的一个具体例子: ```c #include <stdio.h> #include <string.h> struct Person { int age; char name[50]; }; int main() { // 定义一个Person类型的结构体变量 struct Person person = {28, "Alice"}; // 创建一个指向person的结构体指针 struct Person *ptr = &person; // 访问结构体成员的方式一:传统方法 (*ptr).age 和 (*ptr).name printf("Age (using dereference): %d\n", (*ptr).age); printf("Name (using dereference): %s\n", (*ptr).name); // 访问结构体成员的方式二:推荐的方法 ptr->age 和 ptr->name printf("Age (using arrow operator): %d\n", ptr->age); printf("Name (using arrow operator): %s\n", ptr->name); // 修改结构体成员值的例子 ptr->age += 5; // 将年龄增加5岁 strcpy(ptr->name, "Bob"); // 更改名字为"Bob" // 输出修改后的结果 printf("Updated Age: %d\n", ptr->age); printf("Updated Name: %s\n", ptr->name); return 0; } ``` 在这个示例中展示了两种不同的方法来访问由指针所指向的对象属性——一种是显式的解引用形式 `(*ptr)`;另一种则利用更加简洁明了的箭头运算符 `->`[^2]。 此外,在动态分配存储空间的情况下也经常需要用到结构体指针。下面是一个简单的演示案例: ```c #include <stdio.h> #include <stdlib.h> // 定义一个新的节点类型Node typedef struct Node{ int data; struct Node* next; } Node; void insert(Node **head_ref, int new_data){ /* 动态创建新结点 */ Node* new_node = (Node*) malloc(sizeof(Node)); new_node->data = new_data; new_node->next = *head_ref; *head_ref = new_node; } int main(){ Node *head = NULL; insert(&head, 7); insert(&head, 9); insert(&head, 3); while(head != NULL){ printf("%d ", head->data); head = head->next; } return 0; } ``` 此代码片段实现了链表的基本功能之一—插入元素到列表头部,并且每次调用函数insert都会传入整个链表的第一个节点位置即头指针作为参数[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值