1. 常量
常量:在程序执行期间不会改变的值。
常量包括整数常量、浮点常量、字符常量和字符串常量。
- 整数常量:整数,如1、4、35、329
- 浮点常量:小数,如0.0、0.1、4.7、8.224
- 字符常量:括在单引号中,如’c’、‘s’
- 字符串常量:括在双引号中
定义常量:#define 或者 const
#define int AGE 100;
#define char OTHERLING '\n';
const int AGE = 100;
const char OTHERLING = '\n';
double:浮点类型,精确到小数点后6位。
2. 作用域
作用域:在程序中变量所在的区域,如果超过这个区域变量就不能被访问。
变量可分为:局部变量、全局变量和形式参数。
局部变量:在函数或者块内生命的变量,局部变量在函数或块外不能被用。
全局变量:在main函数外声明的变量。
**注:**局部变量和全局变量的名称可以相同,但是在函数内,局部变量的值会覆盖全局变量的值。
形式参数:函数的参数被当作该函数内的局部变量,它们会优先覆盖全局变量。
int main(void){
/blabla
return 0; //以0的状态退出main函数
}
3. 存储类
存储类:存储类定义了变量与函数的可访问性(即作用域范围和生命周期)。
存储类分为static、auto、register等。
static是全局变量的默认存储类。 static修饰局部变量时,只初始化一次。
#include <stdio.h>
static int count = 5;
int count2 = 10; // count 和 count2 都是 static 存储类
void test(){
static int a = 5;
a++;
printf("a = %d, count = %d\n", a, count);
}
结果:
**注:**static是指变量的值在程序生存期一直可以保持,而且变量需要初始化。
4. 运算符
++a & a++
#include <stdio.h>
int main(){
int a = 10;
int b = a++; //先赋值,再+1
printf("%d, %d\n", b,a);
b = ++a; //先+1,再赋值
printf("%d, %d\n", b,a);
b = a--; //先赋值,再-1
printf("%d, %d\n", b,a);
b = --a; //先-1,再赋值
printf("%d, %d\n", b,a);
return 0;
}
结果:
逻辑运算法
&&:逻辑与
||:逻辑或
!:逻辑非
赋值运算符
+=:先运算后赋值
5. 数组
数组:存储相同类型元素的集合。
double a[5] = {1.0, 2.0, 3.0, 4.0, 5.0};
double a[] = {1.0, 2.0, 3.0, 4.0, 5.0}
如果中括号内不写数组大小的话,那么数组的大小就是初始化时原始的个数。
数组的索引从0开始。
6. 指针数组
指针数组:让数组存储int或double或其他数据类型的指针。
#include <stdio.h>
{
int *p[3];
return 0;
}
数组p,有三个整数指针,即p中的每个元素都是指向int值的指针。
#include <stdio.h>
#define MAX 3
int main(){
int array[3] = {10, 100, 1000};
int i;
int *p[MAX];
for(i = 0; i< MAX; i++){
p[i] = &array[i];
}
for(i = 0; i< MAX; i++){
printf("array[%d] = %d\n", i, *p[i]);
printf("p[%d] = %d\n", i, p[i]);
}
return 0;
}
结果:
7. 字符串
C语言中,字符串就是一堆字符数组,以null结尾,null用\0表示。
eg. char a[6] = {'h', 'e', 'l', 'l', 'o', '\0'};
或char a[] = "hello";
或char a[6] = {'h', 'e', 'l', 'l', 'o',};//C语言编辑器会自动的把\0加在字符串末尾
字符串的占位符用%s。
8. 函数指针
函数指针:指向函数的指针变量。可以调用函数和传递参数。
#include <stdio.h>
int max(int x, int y){
return x > y ? x : y;
}
int main(void){
int (*p)(int, int) = &max;
int a, b, c;
printf("Please input 2 numbers:");
int ref = scanf("%d, %d", &a, &b); //scanf返回成功赋值的数据项数
if(ref == 2){ //如果a、b都成功赋值
c = p(a, b);
printf("The max number is: %d\n", c);
}else{
printf("Input wrong!!!!");
}
return 0;
}
(*p)(int, int)
意为定义了一个函数指针*p,有两个整型参数。
9. 结构体
结构体:是一种数据类型,可以存储不同类型数据项,可以表示一条记录。
结构体语法:
struct Person{
char name[50];
int age;
int height;
int weight;
};
10. typedef
typedef:可以为类型取一个新名字。
typedef int NUM;
给int类型取了一个新名字NUM。
可以用来对结构体使用typedef来定义一个新的数据类型名字,然后使用这个新的数据类型直接定义结构变量。
#include <stdio.h>
typedef struct Persons{
char name[50];
int age;
int height;
int weight;
} Person;
int main(){
Person person;
strcpy(person.name, "hhh");
person.age = 19;
person.height = 180;
person.weight = 90;
printf("person name: %s\n", person.name);
printf("person age: %d\n", person.age);
printf("person height: %d\n", person.height);
printf("person weight: %d\n", person.weight);
return 0;
}
#define
和typedef
类似,但有几点不同:
typedef仅限于为类型定义符号名称;
#define不仅可以为类型定义别名,也能为数值定义别名
#define TRUE 1
#define FALSE 0