ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

C语言基础:预处理命令 指针

C语言基础:预处理命令 指针 预处理命令1.gcc编译的4个步骤gcc main.c------a.out预处理展开和#相关的代码展开头文件、展开宏、处理预处理命令(条件编译)#includestdio.h#define PI 3.14#if 0#endifgcc -E(生成预处理阶段的代码) main.c -o(重命名) main.i编译将c语言程序转换为汇编指令gcc -S main.i -o main.s汇编将汇编指令转换成二进制可执行程序gcc -c main.s -o main.o链接将库函数链接起来库函数的实现gcc main.o -o main2.预处理命令1宏定义不带参宏符号常量#define 符号常量 值#define PI 3.1415带参宏宏函数#define 符号常量(参数1参数2...) 宏的实现#define ADD(a,b) ((a)(b)) //求和#define MAX(a,b) ((a)(b)?(a):(b)) //比大小注意1.宏作为预处理命令负责在预处理阶段展开不做运算只是代码的替换2.宏名要大写宏后不能加分号3.宏值只是代码的替换能加括号就加括号4.宏和函数的区别宏是预处理阶段代码替换会使代码体积增大函数时运行时的调用需要保护现场和恢复现场2头文件头文件存放1.其他头文件2.声明的数据类型3.宏定义4.函数和全局变量的声明源文件只存放头文件#include 头文件.h注意1.表示包含的是系统头文件让编译器从系统路径下找/usr/include2. 表示包含的头文件是用户自定义让编译器从当前路径下找3条件编译1.防止头文件重复包含#ifndef __大写文件名_H__#define __ 大写文件名_H__//头文件内容#endif根据宏有没有被定义过决定头文件中的内容要不要加入编译中2.条件编译#if 0 //不编译#endif#if 1 //编译#endif根据逻辑表达式的结果为真则编译为假不编译#ifdef 宏名 //若该宏有被定义则编译若没有则执行else#else#endif:vsp 文件名.c----》打开双屏:sp 文件名.c-----》横向打开双屏:set mousea-----》光标转换wqa------》全部退出并保存ctrlww指针内存程序运行过程中可以访问到的内存存储空间计算机为了方便对内存的管理以字节为单位对内存进行了编号地址指针内存的编号指针指向了一个具体的空间指针变量保存地址的一个变量需要占用8字节内存空间1.指针基础1定义指针变量基类型 *变量名基类型指针所指向的空间内存储的数据类型int、char、float、void、构造数据类型...*类型说明符说明后面的变量是一个指针变量名遵循标识符命名规则p开头pmax、ptmp...int *pi,*pj;char *pch;指针变量中保存的地址是该数据的首地址sizeof(指针)在64位计算机系统下内存中占用8字节在32位计算机系统占4字节(2)指针变量的初始化和赋值int *pNULL;野指针未初始化或未赋值或指向一个已释放内存空间的指针。操作有风险可能导致程序崩溃因此避免野指针1.给指针初变量始化成空指针NULL本质是(void*)02.给指针变量初始化成已有变量的地址3指针的运算符* 指针运算符用于访问数据*指针变量------》指针降级为变量类型-----》基类型int *pp------》int**p-----》int注意1. * 只能放在指针变量前面2. *p访问指针变量的数据------》指针降级为变量类型-----》基类型3. *p访问的字节数取决于该指针的基类型char *p; *p----char,访问1字节int *p; *p----int,访问4字节double *p; *p----double,访问8字节 取地址运算符num;取某变量的空间首地址注意1.只能给变量取地址常量和表达式不行2.获取的是这个变量的首地址4指针的算术运算 * / % 对指针运算没有意义- 指针1-指针2 两个指针之间相隔的元素个数(地址之间的字节差/sizeof(基类型)) 指针1表示从当前地址向后偏移sizeof(基类型)个字节-- 指针-1表示从当前地址向前偏移sizeof(基类型)个字节char *p; p1;----向后偏移1字节%p打印地址2.指针作为函数参数1.被调函数中想要修改主调函数中定义的变量必须地址传递2.被调函数中想要仅使用主调函数中定义的变量既可以值传递也可以地址传递3.被调函数需要返回多个结果时可以传递主调函数多个变量的地址地址指向的空间可以保存被调函数得到的结果3.指针和一维整型数组数组的数组名就是数组首元素地址int a[5]{0}; printf(a%p\n,a); printf(a[0]%p\n,a[0]);注意1.数组名为一个地址常量(右值)不能为其赋值 anum;×一维整型数组作为函数参数传递两种写法 void printf(int a[ ],int len) void printf(int *pa,int len)
返回列表