文章目录

茶屋Teahouse

Every time you lie my place

分类: C语言 (9) 菜鸟的c笔记

更好的使用结构体 有更新!

结构体与指针 在C语言中,指针可以指向万物,自然也少不了结构体。 使用结构体指针,有4点好处: 就像指向数组的指针比数组本身更容易操控一样,指向结构的指针通常比结构本身更容易操控 在早期的C中,结构不能作为参数传递给函数,但是可以传递指向结构的指针 即使能传递一个结构,传递指针通常更有效率 一些用于表示数据的结构中包含指向其他结构的指针 根据这4点好处,证明学习结构体指针的重要性 // Book结构体沿用上面 int main(void) { struct Book books[2] = { {"C Primer Plus", "Stephen Prata", 59.4}, {"黑客与画家", "Paul Graham", 49.00} }; struct Book * book1; // 这是一个指向结构的指针 book1 = &books[0]; // 告诉编译器指针指向何处:结构数组第一个结构 printf("[book1] title = %s, author = %s, price = %f\n", book1->title, book1->autho....

结构体

引子 设计程序时,最重要的步骤之一就是选择表示数据的方法。在许多情况下,简单变量甚至是数组还不够。为此,C提供了结构变量(structure variable)提高表示数据的能力,它能够创造新的形式。 建立结构体声明 小栗子 需求:需要打印一份图书目录。里面包含每本书的各种信息:书名、作者、出版社、版权日期和价格。其中一些元素(例如书名和作者)可以储存在字符数组中,其他项目需要一个int或者float。如果使用5哥不同的数组分别记录每一项都比较繁琐,尤其是要创建多份列表:一份按书名排序、一份按作者排序、一份按照价格排序等。如果能把图书目录的信息都包含在一个数组里更好,其中每个元素包含一本书的相关信息。 因此,就需要一种既能包含字符串也能包含数字的数据形式,而且还要保持各信息的独立。结构体就满足这种情况下的需求。 struct Book { /* 结构体模板:标记为Book (我们通常使用首字母大写的方式来标识结构体) */ char title[128]; // 成员 or 字段 char author[40]; char publisher[256]; int date; float....

c语言与动态内存 有更新!

前言 在C语言中,除了获取变量的指针这种规矩的内存空间,我们还可以通过函数去申请指定大小的内存空间 动态 malloc malloc可以申请一块任意尺寸的空间,因为经常一段空间是连续的 #include <stdio.h> #include <stdlib.h> int main(void) { int *ptr = NULL; ptr = (int *) malloc(sizeof(int)); // malloc() 返回一个void *类型指针 if (ptr == NULL) { printf("获取内存失败"); exit(0); } *ptr = 4; printf("*ptr = %d\n", *ptr); return 0; } Output: *ptr = 4 解析 void * malloc(size_t size) 声明一个空指针 使用malloc函数申请一个连续空间,尺寸为int类型的长度,并将指针类型转换为int类型的指针 判断是否申请成功,若成功则继续,若不成功则退出 为ptr赋值 输出 可以在 (int *) malloc(s....

[头脑风暴]指针与函数还能擦出怎样的火花 有更新!

Q 有一个名为selectMode的函数,它本身有一个char类型的参数,返回值是一个函数指针。这个函数指针也有两个参数,并且返回值类型为整形 int *fp(int, int) selectMode(char); 想法很好,但是编译器却一点都看不懂,因为这应该是两个语句,被糅杂到一行里,所以它就直接报错了 那我们一步一步来解析 首先,这个函数名为selectMode,所以我们要以selectMode为主体去写 第二,selectMode函数有一个char类型的参数 selectMode(char); 第三,函数的返回值是一个函数指针 *selectMode(char); 第四,函数指针也有两个int类型参数 (*selectMode(char))(int, int); 最后,返回值为int类型 int (*selectMode(char))(int, int); 这实际上就是函数指针与指针函数的结合体,在指针函数里套用函数指针 带入到实际应用中,通过selectMode的形参确定返回的是什么指针 int (*selectMode(char op))(int, int) { ....

又是指针!函数与指针的化学反应 有更新!

前言 学了这么久指针,发现它是真的包罗万象,不愧为C语言的精髓 指针函数 和之前的指针数组一样,指针数组是个数组,里面的元素都是指针;指针函数也类似,指针函数是个函数,而这个函数的返回值是指针 写法也没差太多 like: int* pointfunction(void); int * pointfunction(void); int *pointfunction(void); 这三种写法哪一种都可以,第一种更直观一点,在阅读代码时也好理解 例子 char *getWord(char); char *getWord(char c) { switch(c) { case 'A': return "Apple"; case 'B': return "Banana"; case 'C': return "Cat"; case 'D': return "Dog"; default: return "None"; } } 输入一个字符,按照字符返回对应的字符串。因为C语言中没有字符串数据类型,所以此函数返回的实际上是字符数组的指针 注意 指针函数不能使用局部指针变量作为返回值 因为函数的局部变....

常量和指针不得不说的秘密 有更新!

前言 520 'a' 3.14 常量是固定值,在程序执行期间不会改变;变量的值是可以改变的,根据指针我们可以知道,变量并不是直接指向数据,而是指向对应数据的内存地址,如果更改变量的值,实际上只是改变了变量所指向的地址,而地址里的值是没有改变的。 #define NAME "bogendihong" #define PI 3.14 #define 宏定义:C语言允许用一个标识符来表示一串数据,称为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”(上述代码中的 NAME、PI),都用宏定义中的数据去替换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令去完成的。宏代换是由预处理程序自动完成的。 #include <stdio.h> #define PI 3.14 int main() { printf("%f\n", PI); // printf("%f\n", 3.14); PI = 3.1415; // 3.14 = 3.1415; printf("%f\n", PI); return 0; } 常量是不可以被改....