? 数据的容器,数据变容器不变
int a = 1;整型:int
字符型:char
float 单精度浮点型
double 双精度浮点型
#include<stdio.h>int main(){ //sizeof 求所占字节数 printf("%d\n",sizeof(int)); printf("%d\n",sizeof(char)); printf("%d\n",sizeof(float)); printf("%d\n",sizeof(double)); return 0;}输出: 4 1 4 8short int : 使得 int 变短 (4 ---> 2)
long int :使得 int 变长 (4---> 8)
#include<stdio.h>int main(){ short int a = 1 ; long int b = 2; printf("%d\n",sizeof(a)); printf("%d\n",sizeof(b)); printf("%d\n",a); printf("%d\n",b); return 0;}输出: 2 8 1 2signed 有符号
unsigned 无符号
可用于修饰 char 和整型 (包括 short 和 long 修饰过的整型)
signed int 等价与 intunsigned int 使得原有整型长度不变,但是最高位符号位也变成了数据位。仅能表示 0 和正数signed char 强制 char 可以存储有符号整数unsigned char 强制 char 可以存储无符号整数不加限定 则是否有符号依据机器所定#include<stdio.h>int main(){ //int 型 printf("%d\n",sizeof(10)); // L long 型 printf("%d\n",sizeof(10.L)); // f float 型 printf("%d\n",sizeof(10.f)); //double printf("%d\n",sizeof(10.0)); return 0;}输出: 4 16 4 8进制表示: 默认 10 进制 c = a + 31; c = a + 037 // 0 开头表示8进制 c = a + 0x1f //0x开头表示16进制'0'输出 对应字符的 ASCII 码 //字符串“ I AM STRING”#include<stdio.h>int main(){ short int a = 1; int b = 1; float c = 1.0; double d = 1.1; printf("%d\n",sizeof(a)); printf("%d\n",sizeof(a+b)); printf("%d\n",sizeof(a+c)); printf("%d\n",sizeof(a+d)); return 0;}(类型名)表达式;(float) a;(int) (c+d);(float) 5;

/* 三元运算符实例 */ a = 10; b = (a == 1) ? 20: 30; printf( "b 的值是 %d\n", b ); b = (a == 10) ? 20: 30; printf( "b 的值是 %d\n", b );return_type function_name( parameter list );返回值类型 + 函数名+(函数参数列表)
#include<stdio.h>函数参数 a 作用域仅限函数内部 所以无法改变外部变量的值void f(int a){ //局部变量生命周期只对函数调用这一段有效 //函数执行完就被回收了 a = 10;}int main(){ int a = 0; f(); printf("%d",a); return 0;}输出:0如果我想通过函数改变外部变量呢?//方式1: #include<stdio.h> // c++中将参数定义成引用型 void f(int &a){ a = 10; } int main() { int a = 0; f(a); printf("%d",a); return 0; }//方式2:c语言中将函数参数定义成指针型,然后将变量地址传入函数中 #include<stdio.h> void f(int *a){ a = 10; } int main() { int a = 0; //变量地址传入 f(&a); printf("%d",a); return 0; }//语句块的概念(局部代码块):{}括起来的一条或多条语句int main(){ { int a = 0; } printf("%d",a);}输出: error//语句块中定义的变量只在语句块内有效#include<stdio.h>void f(){ int a = 1; a++; printf("%d\n",a);}int main(){ for(int i = 0;i < 3; ++i){ f(); } return 0;}输出: 1 1 1每次调用f()都会重新定义一个新的 a,原来的a被回收//如果想在函数中操作同一个a,使其在函数调用完后不会被回收掉,可以使用静态变量#include<stdio.h>void f(){ static int a = 1; a++; printf("%d\n",a);}int main(){ for(int i = 0;i < 3; ++i){ f(); } return 0;}输出: 2 3 4//指针也就是内存地址,指针变量是用来存放内存地址的变量。//指针变量声明的一般形式为: type *var_name;#include<stdio.h>void f(){ static int a = 1; ++a; printf("%d\n",a);}int main(){ int a = 1; //指针保存的是变量的地址值 int *a_point = &a; printf("%p",a_point); //通过指针可以修改它指向变量的值 // ++a 先自增再传值 a++ 先传值再自增 printf("%d",++*a_point); return 0;}输出:0x7ffe26d3ca44 2#include <stdio.h>#include <stdlib.h>//指针未初始化,它所被分配的地址空间可能随机指向一个变量,如果这个变量很重要,那么不小心对其进行修改会造成严重问题。//如果没有变量要指向,可以 int *point = NULL; 让它指向一个任何变量都不会被分配到的地址int main(){ int *point; printf("%d",point); return 0;}输出:16(随机数)
#include<stdio.h>void f(){ static int a = 1; ++a; printf("%d\n",a);}int main(){ int a[5] = {1,2,3,4,5}; //指针指向数组第一个元素的地址值 int *p = a; for(int i = 0;i < 5;++i){ //通过首地址增加,来顺序访问数组元素 printf("%d\t",*(p+i)); } return 0;}//字符型数组char *s = "i am string "; //常量不可修改char s1[] = "i am string"; //可修改指针数组:#include<stdio.h>int main(){ int a[5] = {1,2,3,4,5}; //指针数组中存的都是a中对应元素的地址 int *p[] = {a,a+1,a+2,a+3,a+4}; for(int i = 0;i < 5;++i){ printf("%p\t",p[i]); printf("%d\t\n",*p[i]); } return 0;}输出结果: 0x7ffde1f97120 1 0x7ffde1f97124 2 0x7ffde1f97128 3 0x7ffde1f9712c 4 0x7ffde1f97130 5 typedef :用来给类型取别名 typedef int verType; verType a 等价于 int a//封装平面内的一个点的坐标(x,y)struct{ int x; int y}point;#include<stdio.h>struct{ int x; int y;}point;int main(){ point.x = 10; point.y = 20; printf("%d,%d",point.x,point.y); return 0;}typedef struct{ int x; int y}Point;#include<stdio.h>typedef struct{ int x; int y;}Point;int main(){ Point point; point.x = 10; point.y = 20; printf("%d,%d",point.x,point.y); return 0;}#include<stdio.h>typedef struct{ int x; int y;}Point;int main(){ Point point; Point *p = NULL; p = &point; //指针指向分量: p->x //结构体指向分量 : p.x p->x = 10; p->y = 20; printf("%d,%d",p->x,p->y); return 0;}//自引用结构的指针#include<stdio.h>typedef struct Point{ int x; int y; struct Point *next;}Point;int main(){ Point p1,p2,p3,p4,p5; Point *p = NULL; p1.x = 1; p1.y = 2; p2.x = 3; p2.y = 4; p3.x = 5; p3.y = 6; p4.x = 7; p4.y = 8; p5.x = 9; p5.y = 10; p1.next = &p2; p2.next = &p3; p3.next = &p4; p4.next = &p5; p5.next = NULL; for (p = &p1; p!=NULL;p = p->next) { printf("(%d,%d)\n",p->x,p->y); } return 0;}输出: (1,2) (3,4) (5,6) (7,8) (9,10)