C 语言编程基础二:重点在指针

int d = 5, result;
float f = 6.382;
result = d * (int) f;
//声明整型变量并赋值
//声明单精度浮点型变量并赋值
//将变量强制转换为整型再计算

此例的计算结果为 30, 在运算之初已将变量 f 强制转换为整型。假若没有使用构成符,
表达式 result = d * f 的结果为 31,因为变量首先被转换成单精度浮点型运算,然后赋值时
再被转为整型。

C 语言中的简写形式

c = c / ( a * b - c % b++ );
c /= a * b - c % b++;
//原表达式
//简化后的表达式

C 语言的预处理命令
宏替换命令
#define 标识符 字符串

#define MAX(a, b) (a >= b) ? a : b //定义宏替换 MAX(),当 a 大于或等于 b 时
//返回 a 值,否则返回 b
 
int main()
{
int x = 190, y = 106;
printf("MAX: %d", MAX(x, y));
//定义整型变量 x、 y 并赋值
//输出 x 和 y 中较大的一个,使用宏代换

终止编译命令
#error 错误信息字符串


文件包含命令
#include "filename.h"
#include <stdio.h>
这两行代码都使编译器读入并编译头文件或源代码文件。双引号用于包含指定相对路
径的文件,若未指明相对路径,则会在当前源文件所在的目录内检索。如果文件没找到,
则检索标准目录,不检索当前工作目录。尖括号用于包含标准函数库文件和用户在编译指
令里所指明的函数库文件,系统会在这些函数库中搜索指定文件。
 


指针的例子:

#include <stdio.h>
int main(){
    int i,*pi;
    char c[]={97,98,99,100,101};
    char *p;
    p=c;
    printf("%c\n",*p++);
    printf("%c\n",*p++);
    printf("#######\n");
    i=4;
    pi=&i;
    printf("%d\n",*pi++);
    printf("%d\n",(*pi)++);
    printf("%d\n",i);
    return 0;
}

结果如下:

a
b
#######
4
10485312
4


指针与一维数组
int i[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, *pi;//定义整型数组 i 和整型指针变量*pi
pi = i; //将指针变量*pi 指向数组 i 的首地址
该赋值操作等同于“ pi = &i[0]”

  • “ pi + n”或“ i + n”表示数组元素 i[n]的地址,即“ & i[n]”。数组 i 有 10 个元素,n 的取值为 0 至 9,则数组的地址可表示为“ pi + 0”至“ pi + 9”,或“ i + 1”至“ i + 9”,与&i[0]至&i[9]的作用一样。
  • 知道了数组元素的地址表示方法,“ *( pi + n)”和“ *(i + n)”就表示为数组的各元素即等效于 i[n]。
  • 指向数组的指针变量也可用数组的下标形式表示为 pi[n],其效果相当于“ *(pi +n)”。

指针与二维数组

int i[2][5] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, *pi;
pi = i[0];
如果要访问其中的元素i[1][2],则可用公式 1 × n + 2 得到该元素的位置,引用时可写作“ *( pi + 1 * n + 2)”。

二维数组每一行都有一个首地址,如 i[0]代表&i[0][0]的地址, i[1]代表 i[1][0]的地址。因此,二维数组也可以被看作 m 个长度为 n 的一维数组,引用二维数组需要将每行的首地址赋给指针变量。

指针与字符串数组
字符型指针变量指向字符串数组首地址后,该指针即可当作字符串使用。

puts()函数的作用是将字符串无格式输出,当*pc 作为其参数时,会内存中将*pc 所指向的地址开始,到字符串结束符之间的字符输出到终端。
如果字符数组中没有字符串结束符,则调用 printf()或 puts()输出函数后程序会出错(一直向后处理,输出很多意想不到的字符,直到遇到值为 0 的内存块)。如果字符型指针变量没有初始化,可能会造成严重影响,如下列源代码所示。

因为 pc 的值不可知, pc 可能指向内存中的任意位置。将字符串保存到 pc 所指向的内存单元中,可能造成非常严重的系统错误。这种用法称之为无源指针,在程序中应避免出现。
 



指针的地址分配
GCC 编译器支持动态分配内存的函数 malloc()和 free(), 它们包含在头文件 stdlib.h 中。动态内存分配的含义是在程序执行的过程中,动态地划分内存空间供程序使用。当程序不需要使用这些内存空间,则可以将其释放。 malloc()函数的作用是向操作系统申请内存, free()函数的作用是释放所申请的内存。


指 针 数 组
指针数组是一种特殊的数组,这类数组存放的全部是同一数据类型的内存地址。指针数组的定义形式为:
数据类型 *数组名[长度];

指向常量的指针,必须用 const 定义为常量指针,以避免修改该指针所指向的数据造成程序错误。由于[ ]符号比间接运算符*的优先级要高,所以首先是数组形式 c[4],然后才是与*结合。这样,指针数组内包含 4 个指针 c[0]、 c[1]、 c[2]和 c[3],分别指向 4 个字符串的首地址。
 

指向指针的指针
数据类型 **变量名;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章