数据类型
- 基本类型:整数型和浮点型
- 枚举类型:用来定义在程序中,只能赋予其一定的离散整数值的变量
- void类型:空类型
- 派生类型:指针类型、数组类型、结构类型、共用体类型和函数类型
变量与常量
#include <stdio.h>
#define VALUE 10 // 常量定义
extern int i; // 变量外部声明
int main(){
char str = 'a';
int i = 1; // 定义加初始化
float j = 1.0;
double k = i / j;
const char LOCALVALUE = 'A';
printf("Hello World!字符str:%c\n", str);
printf("整型i:%d,单精度浮点型j:%f,双精度浮点型k:%lf\n", i,j,k);
printf("i的字节长度:%d,j的字节长度:%d,k的字节长度:%d\n", sizeof(i),sizeof(j),sizeof(k));
printf("常量VALUE:%d\n", VALUE);
printf("局部常量LOCALVALUE:%c\n", LOCALVALUE);
return 0;
}
输出结果:
存储类
第一个文件main.c
#include <stdio.h>
extern void func();
static int count = 5; /* 全局静态变量 */
main()
{
while(count--){ func();}
return 0;
}
第二个文件support.c
#include <stdio.h>
/* 函数定义 */
extern int count;
void func(void)
{
static int i = 5; /* 局部静态变量 */
i++;
printf("i is %d and count is %d\n", i, count);
}
输出结果:
判断、循环、函数和作用域规则
#include <stdio.h>
int main ()
{
int a = 10;
//if语句
if (a > 4){ printf("Yes\n");} else{ printf("No\n");}
a < 5 ? printf("Yes\n") :printf("No\n");
//switch语句
switch(a){
case 5:
printf("is 5\n");
break;
case 10:
printf("is 10\n");
break;
default:
printf("No 5 or 10\n");
}
// while循环
while(a<5){printf("a less 5 forever");}
// fore循环
for(a;a>8; --a){printf("a value: %d\n", a);}
return 0;
}
输出结果:
数组、指针、字符串、结构体和共用体
#include <stdio.h>
#include <string.h>
struct Books // 声明结构体
{
char title[50];
int book_id;
};
union Data // 声明共用体
{
int i;
float f;
char str[10];
};
int main ()
{
int var = 20;
int *var1 = NULL;
var1 = &var; // &取var地址,var1存的为地址,*var1为值20
char var2[5]={'H','e','l','l','o'};
// char var2[] = "Hello";
struct Books Book1; // 声明Book1。类型为Books
strcpy(Book1.title, "C语言学习"); // 不能直接赋值,具体可以查看strcpy()的实现
Book1.book_id = 1;
union Data data;
data.i = 1;
data.f = 1.0;
strcpy(data.str, "Hello C!");
printf("var变量的地址: %x,var1的值:%x,*var1的值:%d\n", &var,var1,*var1);
printf("var2 变量的地址: %x,var2的值:%s\n", &var2, var2);
printf("Book 1 名字: %s\n", Book1.title);
printf("Book 1 编号: %d\n", Book1.book_id);
printf("data.i : %d\n", data.i);
printf("data.f : %f\n", data.f);
printf("data.str : %s\n", data.str); // 由于共用体公用一段内存空间,故这里只有data.str会正常输出
return 0;
}
输出结果:
更多字符串操作函数:strcat();strlen();strcmp();strchr();strstr()
拓展
C语言中->
使用说明
#include <stdio.h>
struct Data{
int a,b,c;
}; // 注意结构体这里要写分号
main(){
struct Data* p;
struct Data data = {1,2,3};
p = &data;
int x = p->a;
printf("x value:%d\n", x);
p->b = 6;
printf("b value:%d\n", data.b);
return 0;
}
输出结果:
c语言中volatile
关键字的作用:
当要求使用volatile声明变量值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。精确地说就是,遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问;如果不使用valatile,则编译器将对所声明的语句进行优化。(简洁的说就是:volatile关键词影响编译器编译的结果,用volatile声明的变量表示该变量随时可能发生变化,与该变量有关的运算,不要进行编译优化,以免出错)