1.关键字static
在C语言中: static是用来修饰变量和函数的
1. 修饰局部变量-称为静态局部变量
2. 修饰全局变量-称为静态全局变量
3. 修饰函数-称为静态函数
1. static修饰局部变量-称为静态局部变量
1.初始局部变量——代码1
#include<stdio.h> //void 在这里表示不需要函数返回任何值 void test() { int a = 1; a++; printf("%d ", a); //此处输出10个2,因为a是局部变量,创建并使用后即销毁,下次使用重新创建 } //生命周期结束 int main() { int i = 0; while (i < 10) { test(); i++; } return 0; }
编辑
2.使用static 修饰局部变量——代码2
#include<stdio.h> //void 在这里表示不需要函数返回任何值 void test() { //a本来是局部变量 //使用static修饰局部变量 static int a = 1; a++; printf("%d ", a); } int main() { int i = 0; while (i < 10) { test(); i++; } return 0; }
编辑
对比代码1和代码2的效果理解static修饰局部变量的意义:
编辑
编辑
编辑
结论:
static修饰局部变量改变了变量的生命周期 让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。
编辑
通过调试以及查看此处反汇编代码可知,此处并没有执行动作,只是在编译时告知创建a变量,且调试时知,运行至此语句会跳过此语句!
2. static修饰全局变量-称为静态全局变量
编辑
编辑
编辑
3. 修饰函数-称为静态函数
编辑
编辑
编辑
编辑
//代码1 //add.c int Add(int x, int y) { return c+y; } //test.c int main() { printf("%d\n", Add(2, 3)); return 0; } //代码2 //add.c static int Add(int x, int y) { return c+y; } //test.c int main() { printf("%d\n", Add(2, 3)); return 0; }
代码1正常,代码2在编译的时候会出现连接性错误.
结论: 一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。
2.#define 定义常量和宏
//#define 定义标识符常量 #define M 100 #define STR "hehe" #include<stdio.h> int main() { printf("%d\n", M); printf("%s\n", STR); return 0; }
编辑
#define 定义宏 #define ADD(X,Y) ((X)+(Y)) #include<stdio.h> int main() { int a = 10; int b = 20; int ret = ADD(a, b); printf("%d\n", ret); return 0; }
编辑
3.指针
3.1指针定义
1 内存 内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。 所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。编辑
变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。 取出变量地址如下:
#include <stdio.h> int main() { int num = 10; //#//取出num的地址 //注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址) printf("%p\n", &num);//打印地址,%p是以地址的形式打印 return 0; }
编辑
编辑
那地址如何存储,需要定义指针变量?
int num = 10;
int *p;//p为一个整形指针变量
p = #
#include<stdio.h> int main() { //& 取地址操作符 //%p - 是以地址的形式打印 int a = 10;//a要在内存中开辟空间的 printf("%p\n", &a); int * p = &a;//p就是指针变量 *p = 20;//* --> 解引用操作符号 printf("%d\n", a);//20 //char ch = 'w'; //char * pc = &ch; return 0; }
编辑
编辑
& 取地址操作符
%p - 是以地址的形式打印编辑
指针的使用实例:
#include <stdio.h> int main() { int num = 10; int *p = # *p = 20; return 0; }
编辑
以整形指针举例,可以推广到其他类型,如:
#include <stdio.h> int main() { char ch = 'w'; char* pc = &ch; *pc = 'q'; printf("%c\n", ch); return 0; }
3.2 指针变量的大小
#include <stdio.h> //指针变量的大小取决于地址的大小 //32位平台下地址是32个bit位(即4个字节) //64位平台下地址是64个bit位(即8个字节) int main() { printf("%d\n", sizeof(char *)); printf("%d\n", sizeof(short *)); printf("%d\n", sizeof(int *)); printf("%d\n", sizeof(double *)); return 0; }
结论:指针大小在32位平台是4个字节,64位平台是8个字节。
在锤子的眼里什么都是钉子,在指针的眼里什么都是地址!
#include <stdio.h> //& - 取地址操作符 //* - 解引用操作符/间接访问操作符 int main() { int a = 10; //%p - 打印的格式来打印 //printf("%p\n", &a); int * p = &a;//p是用来存放地址的,所以我们把p称为指针变量 *p = 20;//*的解引用操作符,*p的意思就是通过p中的值,找到p所指向的对象,也就是说*p就是a //printf("%d\n", a); printf("%d\n", sizeof(p)); /*printf("%p\n", p); printf("%p\n", &a);*/ return 0; }
编辑
编辑
#include <stdio.h> int main() { printf("%d\n", sizeof(char*));// printf("%d\n", sizeof(short*));// printf("%d\n", sizeof(int*));// printf("%d\n", sizeof(long*));// printf("%d\n", sizeof(float*));// printf("%d\n", sizeof(double*));// return 0; }
编辑
编辑
编辑
编辑
32位可以管理4G内存空间
//指针变量的大小取决于地址的大小
//32位平台下地址是32个bit位(即4个字节)
//64位平台下地址是64个bit位(即8个字节)
结论:指针大小在32位平台是4个字节,64位平台是8个字节。
编辑
一个内存单元的大小是1个字节,管理内存单元需要编号,编号大小为4个字节