文章目录

茶屋Teahouse

Every time you lie my place

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

指针 (一) 有更新!

指针 基础 定义指针变量 类型名 * 指针变量名 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....

数组不是指针 有更新!

指针与数组 通过数组下标所能完成的任何操作都可以通过指针来实现。一般来说,用指针编写的程序比用数组下标编写的程序执行速度快,但另一方面,用指针实现的程序理解起来稍微困难一些。 声明一个数组 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中元素的类型或数组长度是什么,上面....

左值与右值 有更新!

左值与右值? 左值(L-value)与右值(R-value),二者之间的区别是什么? 左值与右值 01 这两个术语是多年前由编译器设计者所创造并沿用至今的,尽管它们的定义并不与C语言严格吻合。 02 左值就是那些可以出现在赋值符号左边的东西;右值就是那些可以出现在赋值符号右边的东西。 这样的解释有些脱下裤子放屁的意思,通过名称我们也能得出左值和右值的意思,那么应该出现在赋值符号左边的东西是什么呢? 03 1. a = b + 1; 2. b + 1 = a; 在语句1中,a是一个左值,因为它标识了一个可以存储结果值的地点;b + 1是个右值,因为它指定了一个值。 那么,能像语句2一样,互换左右值的位置吗? 原先用作左值的a此时也可以作为右值,因为每个位置都包含一个值。然而,b + 1无法作为一个左值,因为它并未标识一个特定的位置。因此,语句2是非法的。 04 int a = 5; ++(a++); 如果尝试执行此段代码,则会出现如下报错 main.c:4:2: error: expression is not assignable ++(a++); ^ ~~~~~ 1 error ....