初识C语言(03)—学习笔记
常见关键字
C语言提供了丰富的关键字,这些关键字都是语言本身预先设定好的,用户自己是不能创造关键字的。
归类
下面是按照关键字的用途不同进行的归类
变量的命名规则
-
有意义,例如 int age; float salary;等
-
名字必须是字母、数字、下划线组成,不能有特殊字符,同时不能以数字开头
int 2c; //err int _2c; // ok -
变量名不能是关键字
typedef
typedef是类型定义,这里可以理解为类型重命名,例如
typedef unsigned int uint;
就是将无符号整形unsigned int 重命名为uint。此时我们可以在初始化无符号整形a时使用unsigned int a =0;和uint a= 0; 效果一样。
#include<stdio.h>
typedef unsigned int uint;
int main()
{
unsigned int a = 0;
uint a1 = 0;
return 0;
}
static
-
修饰局部变量
#include<stdio.h> void test() { int a = 1; a++; printf("%d\n", a); } int main() { int i = 0; while (i < 10) { test(); i++; } return 0; }
上面的输出结果是10个2;这是因为a是一个局部变量,进入生命周期开始,出来生命周期结束,a被销毁。如果在test函数的int a = 1;前面加上static又会如何?
它的输出结果是2~11
#include<stdio.h> void test() { static int a = 1; a++; printf("%d\n", a); } int main() { int i = 0; while (i < 10) { test(); i++; } return 0; }
static修饰局部变量时,局部变量出了作用域,不销毁。本质上,static修饰局部变量改变了变量的存储位置,影响了变量的生命周期,使得生命周期变长,和整个程序一样长的生命周期。
-
修饰全局变量
全局变量是具有外部链接属性的
static修饰全局变量的时候,这个全局变量的外部链接属性就变成了内存链接属性。其他源文件(.c)就不能再使用到这个全局变量。
extern 表示 声明外部符号
-
修饰函数
一个函数本来具有外部链接属性的,但是被static修饰的时候,外部链接属性就变成了内部链接属性,其他源文件(.c)就无法使用了。
define定义常量和宏
-
常量
#include<stdio.h> #define MAX 100 int main() { printf("%d\n", MAX); int a = MAX; printf("%d\n",a); int arr[MAX] = { 0 }; return 0; }
-
宏
#include<stdio.h> #define ADD(x,y) ((x)+(y)); int main() { int a = 10; int b = 20; int c = ADD(a, b); printf("%d\n", c); return 0; }
在调用宏时,宏的参数x被替换为a,参数y被替换为b,宏体就变为了((a)+(b))
寄存器 - register
补充:
.h 头文件 (函数声明、类型声明、头文件的包含)
.c 源文件(函数实现)
浮点数的四舍五入,不能用肉眼看的数值来计算的!!!
因为浮点数在内存中可能不能精确保存。
例如 12.455
被保存为 12.454988828937……
指针
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。内存会被划分为一个个的内存单元(一个内存单元的大小为 1byte(字节))
指针是用来存放变量的地址的
内存单元
编号->地址->地址也被称为指针
存放指针(地址)的变量就是指针变量。
#include <stdio.h>
int main()
{
int a = 10;//向内存申请4个字节,存储10
// &a;//取地址操作符
//printf("%p\n", &a);// 008FF9CC 十六进制
int* p = &a;
//p就是指针变量
return 0;
}
*p 解引用操作符,意思就是通过p中存放的地址,找到p所指向的对象
int* p;
char* p2;
不管是什么类型的指针,都是在创建指针变量
#include <stdio.h>
int main()
{
int a = 10;//向内存申请4个字节,存储10
// &a;//取地址操作符
//printf("%p\n", &a);// 008FF9CC 十六进制
int* p = &a;
//p就是指针变量
*p = 20;//*p 解引用操作符,意思就是通过p中存放的地址,找到p所指向的对象,*p就是p指向的对象
// p存放着a的地址,通过p可以访问到a的值,同时也可以位a重新赋值。
printf("%d\n",a);
char ch = 'w';
char* pc = &ch;
return 0;
}
指针变量是用来存放地址的
指针的大小取决于一个地址存放的时候需要多大的空间
32位机器上的地址:32bit位 - 4byte,所有指针变量的大小是4个字节
64位机器上的地址:64bit位 - 8byte,所有指针变量的大小是8个字节
以下是不同类型指针所占内存的大小
#include <stdio.h>
int main()
{
printf("%zu\n", sizeof(char*));//32位机器 4
printf("%zu\n", sizeof(int*));//32位机器 4
printf("%zu\n", sizeof(short*));//32位机器 4
printf("%zu\n", sizeof(long*));//32位机器 4
printf("%zu\n", sizeof(long long*));//32位机器 4
printf("%zu\n", sizeof(float*));//32位机器 4
printf("%zu\n", sizeof(double*));//32位机器 4
return 0;
}
// 64位机器上 8 8 8 8 8
结构体 - struct
人:名字+年龄+性别+地址+电话
书:书名+作者+出版社+定价+书号
复杂对象
C语言就给了自定义类型的能力,自定义类型中有一种叫:结构体 struct
我们前面学到的类型有char、short、int、long、long long、float、double,这些都属于单一的类型而结构体是把一些单一的类型组合在一起的做法。
#include <stdio.h>
//学生
struct Stu
{
//成员
char name[20];
int age;
};
int main()
{
//结构体可以被整体初始化
struct Stu s = { "zhangsan",20};
// 结构体对象.成员名
// 变量创建后,再对它的值进行修改,这个叫赋值
strcpy(s.name, "tony");
return 0;
}
结构体只能被整体初始化,不能被整体赋值,想要赋值的话只能把成员逐个地取出来,然后再去赋值。
-
结构体成员的访问方法
我们可以通过变量或变量的地址去访问结构体的成员。
#include <stdio.h> //学生 struct Stu { //成员 char name[20]; int age; }; void print(struct Stu* ps) { printf("%s %d\n", (*ps).name,(*ps).age); // -> //结构体指针变量 -> 成员名 printf("%s %d\n", ps->name, ps->age); } int main() { //结构体可以被整体初始化 struct Stu s = { "zhangsan",20}; // 结构体对象.成员名 // 变量创建后,再对它的值进行修改,这个叫赋值 strcpy(s.name, "tony"); // 1、通过变量访问结构体成员(.) printf("%s %d\n", s.name, s.age); // 2.通过结构体指针变量 -> 成员名 struct Stu* ps = &s; printf("%s %d\n", ps->name, ps->age); // 3.通过定于函数print() 访问成员 print(&s); return 0; }