C语言中不被人注意的一些东西(笔记)

程序运行的各个阶段

.c 或者.cpp 文件 源文件;
预编译形成.i文件;
编译形成.o或者.obj二进制可执行文件;
链接形成.exe文件;

宏操作符(#define)

在预编译阶段执行 进行替换 不进行类型检验 不进行分配空间;
用于预编译处理阶段;将宏参数转换为字符串;只有宏定义中使用#define;
例子:#define MAXLENTH 100

const

在编译阶段进行 进行类型检测 进行分配空间;

pragma once

一个比较常用的c/c++的杂注,只要在头文件的最开始加上这个;就能保证头文件只被编译一次;

##操作符

用于预处理阶段,将粘连两个标识符,只有宏定义中使用;
例子:
#define Connect(a,b) a##b
int Conect(a,1); //int a1
a1 = 2;

指针

  1. 指针有三个值 &p是指针p的地址;

  2. p是指针p自身的值;

  3. *p是指针p指向的值;

     int *p = &a;   // & *p<=>&a; *&p<=>&a;
     int *p = &b;  //把b的地址给p ,*是标识符;*p是p指向的值;
    

指针和引用的区别

Student *st st为指针;引用时为st->s_name//st->s_id;
Student &sp sp为别名;引用时为sp.s_name//sp.s_id;

存储区域的区别

1.代码区:存放函数体的二进制代码;

2.数据区/data:全局变量,静态变量和常量是分配在数据区中的,数据区包括bss(未初始化数据区)和初始化数据区。

3.堆区/heap:由程序员手动分配和释放空间,通过mallic/new等关键字申请;使用完后必须释放;使用free(p);释放后p为失能指针或失效指针;

4.栈区/ stack:由编译器自动分配释放,存储函数内部的局部变量的值,函数参数的值和自定义对象的引用和函数的返回地址;是由系统自动分配的,一般速度较快;存储地址是连续且存在有限栈容量,会出现溢出现象。

注意:
(1)堆向高内存地址生长;
(2)栈向低内存地址生长;
(3)堆和栈相向而生,堆和栈之间有个临界点,称为stkbrk;
注意:

未初始化数据区(BSS):用于存放程序的静态变量,这部分内存都是被初始化为零的;而初始化数据区用于存放可执行文件里的初始化数据。这两个区统称为数据区。

指针 引用和const的混用

int main()
{
	int a = 10, b = 20;
	int *p1 = &a;
	*p1 = 100;
	p1 = &b;
	const int *p2 = &a; **//指针指向的值不能变;不能修改;**
	*p2 = 100;   **// * p2是常量 不能赋值;**
	p2 = &b;
	int const *p3 = &a; **//指针指向的值不能变;不能修改;**
	*p3 = 100; **// * p3是常量 不能赋值;**
	p3 = &b;
	int * const p4 = &a; **//指针自身的值不能变;不能修改;**
	*p4 = 100;
	p4 = &b;  **//p4是常量;不能赋值;**
	const int * const p5 = &a; **//指针指向的值和自身的值都不能变;都不能修改;**
	*p5 = 100; **//p5是常量不能赋值;**
	p5 = &b; **// * p5是常量不能赋值;**
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值