最近一直在看,感觉C语言的语法确实复杂些,像打印素数这种题在Python里面我可以很快做出来,C语言里面因为变量声明,大括号这种问题,我不能很快做出来。还有就是在函数体和循环体里面老是忘了写分号。
static修饰全局变量,在其他源文件里面初始化一个全局变量
int g_value =2021;//其他源文件里面的全局变量 在主程序使用的时候,需要extern g_value就可以使用了。 但是在这个全局变量初始化的时候加上static static int g_value=2021;//此时变成静态全局变量,不能再其他文件使用 static修饰函数也是一样的道理 在非主程序文件里面定义一个函数 int small(int x,int y) { int z; z =(x<Y)?x:y; return z; } 在主程序的int main 上面声明一下 int small(int,int);//分号不可少 后面就可以使用了 但是在加上static,变成 static small(int x,int y) { ... }//就不能使用了 普通的函数,具有外部链接属性(外部的其他源文件想要使用它,声明一下就可以了,) static修改函数后,外部链接属性变成了内部链接属性。
#define定义常量和宏 define不是关键字,是一种指令 #define MAX 31 int a =MAX,编译器在遇到MAX的时候,自动把MAX转换为31 define定义宏。宏是具有参数的标识符 #define SUM(x,y) ((x)+(y)) #define MAX(x,y) (x>y)?(x):y MAX(1,3) SUM(2,4)就可以正常使用了
指针,现实中,中国很大,但是给我一个确定的地址,我就能找到一个房间。
程序是怎么确定地址的呢?每个房间又是有多大?
32位的电脑,32根地址线/数据线,每一根产生01,电信号转换为数字信号,就可以产生0-0*32的序列,这些序列就是地址。
int a =20;//初始化一个变量a,向内存申请了4个byte的空间用来存放a,
%p 转换说明打印地址,&取地址符
printf("%p",&a);//输出a的地址。假设为16进制002F41CC
指针变量就是用来存放地址的,
int* pa = &a;
*号说明是指针变量,int*因为a是int类型的,pa为指针名,&a为取a的地址。
printf("a的地址是%p,pa的值是%p",&a,&pa);
因为是地址,所以都用%p,输出结果是一样的
我们拿到地址不是结果,我们有了地址就可以对指针pa指向的变量进行操作,*解引用操作,*pa,
对*pa进行解引用操作,找到它所指向的变量a.*pa=20;地址内(内存内)存放的值修改了20。
int a= 10; | 10(0x002F41CC) | a |
int* pa =&a; | 002F41CC(0X,,,,) | p |
*pa=20 | 20 *pa是a,内存内存放的是20 |
指针变量的大小并不一定,在32位平台是32位即4字节,在64位平台是8字节(64跟地址线)
VS修改平台,debug->配置修改器->活动解决方案修改为x64
结构体是C语言中非常重要的知识点,它让C语言有能力去描述复杂类型,比如描述学生。学生有名字,性别,年龄和家庭住址等,其他类型都不能描述。就需要使用结构体,我们自己创建出来的一种类型
假设我们描述的是书,有书名和价格属性. struct Book { char name[20]; short price; };//分号必不可少 int main() { struct Book b1 ={"C语言程序设计",55};利用结构体类型创建一个该类型的结构体变量b1 printf("b1的书名是%s,价格是%d",b1.name,b1.price); . 点操作符,拿出成员 并且可以修改 b1.price=40; printf("修改后的价格是%d",b1.price); 用指针变量拿出struct的成员 struct Book* pb=&b1; *pa是pb指向内存空间的内容 (*pb).name (*Pb).price 拿出书名和价格 还有一个形象的操作符可以拿出 -> 指针结构体->获取成员 pb->name pb->price
还有一点需要注意的是, Book的创建变量的时候,顺序不要变 name因为是数组,因此不能简单赋值 引入头文件<string.h> strcpy(b1.name,"C primer");注意数组大小,第一个参数是需要修改的值,第二个是给定的字符串
这样,C语言初识的部分就完结了。我在学的时候东西绝大部分都能听懂,主要有些题会挖坑,比如if(i=0;i=0;i++) 判断条件是赋值,获取的值为0,0为假,循环不执行。还有就是有些简单的算法都不是很清晰,比如二分法。多练嘛,之后就是if的总结