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

版权声明:转用请注明出处 https://blog.csdn.net/weixin_39411321/article/details/85219256

程序运行的各个阶段;
.c 或者.cpp 文件 源文件;
预编译形成.i文件;
编译形成.o或者.obj二进制可执行文件;
链接形成.exe文件;

(#):在预编译阶段执行 进行替换 不进行类型检验 不进行分配空间;

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

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

#宏操作符:用于预编译处理阶段;将宏参数转换为字符串;只有宏定义中使用#define;

例子:
#define MAXLENTH 100

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

指针和别名的区别
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):用于存放程序的静态变量,这部分内存都是被初始化为零的;而初始化数据区用于存放可执行文件里的初始化数据。这两个区统称为数据区。
指针:

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

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

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

int *p = &a; // & *p<=>&a; *&p<=>&a;

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

接下来看一个程序:

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;
}

猜你喜欢

转载自blog.csdn.net/weixin_39411321/article/details/85219256
今日推荐