C语言初识

最近一直在看,感觉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的总结

上一篇:大厂面试题:赛马问题【超详细图解】


下一篇:原型设计模式,编程范式与面向对象