随笔分类 - 编程语言 / C语言
摘要:局部变量在函数执行的时候才分配,函数返回后,这个函数所用的局部地址又被系统回收(即返回的局部指针指向的地址是无效的) bss段(未初始化)、data段(已初始化)、常量区在代码加载的时候就分配了。 函数可以返回局部变量的值; 函数可以返回一个局部指针,但是这个局部指针有限制条件(即在内存中还存在,没
阅读全文
摘要:有三个文件cal.c、cal.h、main.c cal.c中是模块的函数实现,cal.h是模块的函数申明,main.c是调用各模块的功能。 #include <> 和#include ""区别: <>是从linux标准的头文件目录下去找头文件,如/usr/include/、/usr/local/in
阅读全文
摘要:1. 二维数组可以用行指针和列指针来表示 行指针 = 数组指针;二维数组名就是第一行的首地址 数组指针加1表示跳过整个指向的数组。 2. 数组指针如何访问数组成员空间? p指向的是数组的地址,也就是&数组名,那么*p就是对取地址后的数组名再*操作,因为&与*为互逆操作,所以此时*p就等同于数组名,所
阅读全文
摘要:void的用法: 当要定义一个无参的函数时,只能想下面这样定义: int f(void){}//void必须写,这样才是一个无参的函数; int f(){}//这要定义不是一个无参的函数,这个函数表示可以接受任意多个函数。 如:int f(){} int g(void){} f();//能正确执行
阅读全文
摘要:字符串分为字符串常量和字符串变量: 字符串变量(字符数组):c中没有字符串的数据类型,只能用字符数组模拟(即用字符数组表示字符串); 注:字符数组不一定是字符串(因为字符数组中可以不含'\0');而字符串一定是一个字符数组(包含0元素也可以是一个字符数组) 字符串常量:就是用“”括起来的一串字符;如
阅读全文
摘要:int i; //i变量的类型是int,即一个i变量的占4字节的内存空间 char c;//c变量的类型是char,即一个c变量占一个字节的内存空间 int ai[5];//ai变量的类型是int[5](也就是说int[5]是一种数组的类型),即一个ai变量占20个字节的内存空间 二维数组: typ
阅读全文
摘要:常量有三种形式: 1. 如5、‘a’、“hello”,这种字面量都是常量,其不能被赋值 2. 用#define来定义,使用宏定义,如#define PI 3.14,PI就是一个常量,其不能被改变(被赋值) 如PI = 555;是错误的 3. 用enum来表示常量,enum中的常量只能表示整型。 en
阅读全文
摘要:现study目录有三个目录:src、include、obj src目录下有main.c、func1.c include目录下有func1.h //main.c #include "func1.h" #include <stdio.h> int main() { func1(); printf("th
阅读全文
摘要:全局变量和静态全局变量未初始化时,默认值为0; 局部变量未初始化时,其值是未知的;静态局部变量未初始化时,默认值也为0; 所以在定义局部变量的时候最好初始化。
阅读全文
摘要:结构体: struct Student { char name[32]; int age; int sex; char add[32]; }; 上面只是一种数据类型(同int、char基本类型一样),表示是一个结构体,不占用地址空间,只有在定义结构体变量时才分配空间,即struct Student
阅读全文
摘要:int main() { char str1[] = {'h','e','l','l','o'}; char str3[] = "hello"; char str4[5] = "hello"; char *str2 = "hello";//'\0' int len1 = sizeof(str1)/s
阅读全文
摘要:变量访问的两种方式(取值): 1.通过变量名 2.通过变量的地址(指针) int *p;//指针变量p指向一个int类型的地址 指针变量和数组的区别(int *p、int arr[3]): 1. 指针变量指向的地址是可以变的(即p可以指向不同的整型地址),所以p++是可以的; 而数组名是一个常量(即
阅读全文
摘要:普通数组: int arr[5];//数组arr中存放了5个整型数 int int int int int arr[0] arr[1] arr[2] arr[3] arr[4] 指针数组:是一个数组,里面存放的是指针 int *arr1[5];//表示是一个指针数组,里面存着5个整型指针 int *
阅读全文
摘要:可执行文件就是多个目标文件(.o文件)通过链接生成的 预处理(.i文件):宏替换、头文件的展开、条件编译(带#的处理)、去注释 编译(.s文件):语法检测,生成汇编代码 汇编(.o文件):将汇编代码生成二进制文件 链接:找调用函数的地址(一个目标文件中可能有多个函数,我们只有一个函数或几个),通过函
阅读全文
摘要:所有的字符窜都是以‘\0’结束的 sizeof和strlen sizeof()是一个关键字,表示的是操作数所占空间的大小; strlen()是一个函数(参数必须是char *的指针),表示的是字符窜的长度,strlen是通过判断遇到\0来判断字符窜结束 1. int arr1[] = {1,2,3,
阅读全文
摘要:static static有两种使用场景: 1. 修饰变量 修饰局部变量(称为静态局部变量):出了这个变量的作用域后,该变量不会被销毁。该变量存储在静态存储区 修饰全局变量(称为静态全局变量):和普通全局变量的区别在于这个被static修饰的全局变量不能在其他源文件中使用,(即不能在其他源文件中用e
阅读全文
摘要:在一个c程序中,将内存分为: 代码区: 常量区:存放的一些常量 静态存储区:存放全局和静态变量 堆: 栈: int a = 0; //全局初始化区 char *p1; //全局未初始化区 main() { int b;// 栈 char s[] = "abc"; //就在栈上 char *p2; /
阅读全文
摘要:一个程序中数据的计算是通过CPU。那么CPU中的数据来自哪里呢? 1. 内存(物理内存):所以一个进程的虚拟内存操作后会通过MMU将虚拟内存中的数据映射到物理内存 2. 寄存器(cpu的寄存器):当一个变量的优化级别较高时,会将变量存到cpu的寄存器中 用信号理解volatile 代码说明: #in
阅读全文
摘要:c程序的内存分配: 执行程序会将程序加载到内存,内存大体上被分为三个区:栈段、堆段、数据段(全局变量和static变量) 栈:局部变量和形式参数会保存在栈区,函数调用完之后,释放栈帧和函数中的局部变量。 堆:堆区空间远大于栈区空间,可自行分配,并在使用完后手动释放内存空间。 数据段:存放全局变量和s
阅读全文