指针 (一) 有更新! 2021-09-14 指针 基础 定义指针变量 类型名 * 指针变量名 char * pa; // 定义一个指向字符型的指针变量 int * pb; //定义一个指向整形的指针变量 取地址运算符 如果需要获取某个变量的地址,可以使用取地址运算符(&)** char * pa = &a; **int * pb = &f; 取值运算符 如果需要访问指针变量所指向的数据,可以使用取值运算符( * )** **printf("%c, %d\n", * pa, * pb); 注: * 号在不同的地方有着不同的作用,在定义指针变量时为修饰符;在取值时为运算符。这属于是符号的重用。 直接访问与间接访问 int a = 3; int *pa = &a; a = 4; // 直接访问 *pa = 5; // 间接访问 避免访问未初始化的指针 int *a; *a = 123; 未初始化的指针被称为野指针,修改一个野指针的值是个危险操作,因为我们并不知道这个指针指向的内存里有什么内容,盲目修改可能会发生系统错误。 小栗子 char a = 'F'; int f = 123....
数组不是指针 有更新! 2021-06-01 指针与数组 通过数组下标所能完成的任何操作都可以通过指针来实现。一般来说,用指针编写的程序比用数组下标编写的程序执行速度快,但另一方面,用指针实现的程序理解起来稍微困难一些。 声明一个数组 int a[10]; 定义一个长度为10的数组a。换句话说,它定义了一个由10个对象组成的集合,这10个对象存储在相邻的内存区域中,名字分别为a[0]、a[1]、a[2]、......、a[9]。 指向这个数组 int *pa = &a[0]; int x = *pa; 定义一个指向整型对象的指针,并将指针指向数组a的第0个元素。即,pa的值为数组元素a[0]的地址。将数组元素a[0]的值复制到变量x中。 如果pa指向数组中的某个特定的元素,那么,根据指针运算的定义,pa+1将指向下一个元素,pa+i将指向数组元素之后的第i个元素,而pa-i将指向pa所指向数组元素之前的第i个元素。因此,如果指针pa指向a[0],那么*(pa+1)引用的是数组元素a[1]的内容,pa+i是数组元素a[i]的地址,*(pa+i)引用的是数组元素a[i]的内容。 无论数组a中元素的类型或数组长度是什么,上面....
c语言与动态内存 有更新! 2020-09-21 前言 在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....
[头脑风暴]指针与函数还能擦出怎样的火花 有更新! 2020-08-28 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) { ....
又是指针!函数与指针的化学反应 有更新! 2020-08-27 前言 学了这么久指针,发现它是真的包罗万象,不愧为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语言中没有字符串数据类型,所以此函数返回的实际上是字符数组的指针 注意 指针函数不能使用局部指针变量作为返回值 因为函数的局部变....
常量和指针不得不说的秘密 有更新! 2020-08-13 前言 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; } 常量是不可以被改....