常见单位和数据类型的范围
bit byte kb mb gb tb pb
#include<stdio.h>
int main(){
printf("%d\n",sizeof(char)); //1 2^8 == 1024
printf("%d\n",sizeof(int)); //4 2^32 == 4294967296
//-2,147,483,648 到 2,147,483,647。10位数
printf("%d\n",sizeof(float)); //4
printf("%d\n",sizeof(double)); //8
printf("%d\n",sizeof(long)); //4
printf("%d\n",sizeof(short)); //2
printf("%d\n",sizeof(long long)); //8
return 0;
}
全局变量和局部变量
#include<stdio.h>
int a = 100;//全局变量
int main(){
int a = 10;//函数里的局部变量,可以和全局变量名字相同,但是局部优先
printf("%d",a);//10
return 0;
}
变量的作用域
局部变量的作用域
局部范围【函数里】
#include<stdio.h>
int main(){
{
int a = 100;
printf("%d",a);
}
printf("%d",a);
return 0;
}
全局函数的作用域
作用域整个工程
#include<stdio.h>
int a = 100;//全局变量
int main(){
{
printf("%d ",a);
}
printf("%d",a);
return 0;
}
变量的生命周期 ~= 变量的作用域
局部变量的生命周期
进入作用域开始,离开作用域结束
全局变量的生命周期
整个工程
常量
- 字面常量【只有这个常量可以修改】
#include<stdio.h>
int main(){
int a = 20;
a = 50;
printf("%d",a);//50
return 0;
}
可以修改a的值
- const修饰的常变量
#include<stdio.h>
int main(){
const int a = 20;
a = 50;//报错,常变量 不可更改
printf("%d",a);
return 0;
}
- define定义的标识符常量
#include<stdio.h>
#define max 100
#define str "qwert"
//没有数据类型
int main(){
max = 123; //error 不可修改
// a = 50;
printf("%d",max);
printf("%s",str);
return 0;
}
- 枚举常量
#include<stdio.h>
//#define max 100
//#define str "qwert"
enum Color{
RED,//枚举常量
GREEN,//枚举常量
BLUE,//枚举常量
};
int main(){
enum Color c = BLUE;//2
enum Color a = RED;//0
//printf("%s",str); error,其实枚举常量是一个数字,有点像是数组
printf("%d",c);//2
return 0;
}
字符串
C语言里面没有字符串类型
结尾默认有\0
#include<stdio.h>
#include<string.h>
int main(){
char arr1[] = "abcd";
char arr2[] = {'a','b','c','d'};
char arr3[] = {'a','b','c','d','\0'};
printf("%s ",arr1);
printf("%s ",arr2);//随机值,没有\0结束
printf("%s ",arr3);//与arr1等价
printf("%d\n",strlen(arr1));//4 \0不算 strlen 使用需要string.h
printf("%d\n",strlen(arr2));//随机值
printf("%d\n",strlen(arr3));//4 \0不算
return 0;
}
函数
#include <stdio.h>
int ADD(int a, int b){//ab是形参
int z = 0;
z = a + b;
return z;
//也可以直接 return a + b;
}
int main(){
int num1 = 0;
int num2 = 0;
scanf("%d %d",&num1,&num2);//num1,num2是实参
int sum = ADD(num1,num2);
printf("%d",sum);
return 0;
}
数组
一个重要思想:通过下标访问数组里的元素,用循环产生下标
操作符
单目操作符【对一个变量进行操作】
! - + & sizeof ~ -- ++ * (类型)
- !逻辑非
#include<stdio.h>
int main(){
int a = 22;
int b = 0;
printf("%d ",!a);//0
printf("%d",!b);//1
return 0;
}
- -负值
#include<stdio.h>
int main(){
int a = 22;
printf("%d ",-a);//-22
return 0;
}
- +没有什么用,1==+1 -1 == +(-1)
- sizeof
单位byte
#include<stdio.h>
int main(){
int arr[10] = {0};
printf("%d ",sizeof(arr));//40 计算整个数组大小
printf("%d ",sizeof(arr[0]));//4 计算数组第一个元素占的字节数
printf("%d ",sizeof(arr) / sizeof(arr[0]));//计算数组元素有多少个
return 0;
}
- ++ --
区别i++ 与 ++i
前者先赋值[原来的值赋给别人],再自增【自己最后在自增改变自己】
后者先自增,再复制
#include<stdio.h>
int main(){
int a = 10;
int b = a++;
// b = 10 a = 11
int c = ++a;
// a = 12 c = 12
printf("%d %d",b,c);//10 12
return 0;
}
#include<stdio.h>
int main(){
int a = 10;
int b = a++;
// b = 10 a = 11
int c = b++;
// c = 10 b = 11
printf("%d %d %d\n",a,b,c)// 11 11 10
return 0;
}
#include<stdio.h>
int main(){
int a = 10;
int b = ++a;
// a = 11 b = 11
int c = ++b;
// b = 12 c = 12
int num1 = 9;
int num2 = --num1;
// num1 = 8 num2 = 8
int num3 = --num2;
// num2 = 7 num3 = 7
int num4 = --num3;
// num3 = 6 num 4 = 6
printf("%d %d %d\n",a,b,c);//11 12 12
printf("%d %d %d %d\n",num1,num2,num3,num4);//8 7 6 6
return 0;
}
- (类型)
强制类型转化
#include<stdio.h>
int main(){
int a = 21;
int b = 4;
printf("%f ",(double)a/b);//5.25
return 0;
}
逗号运算符
都计算,但是只打印最远的那个
#include<stdio.h>
int main(){
int a = 4;
int b = 12;
int c = 6;
int tmp = (a++,b/a,c--);
//都运行了,只是只打印了c--
// a=5
int res = (c=b/a,a=b+c,c-a);
// c = 2 ,a = 14 , c-a==-12
printf("%d %d",res,tmp);//-12 6
return 0;
}
下标引用操作符[]
#include<stdio.h>
int main(){
int arr[10] = {0,1,2,1,3,4,5,6,6,8};//声明数组,arr[常量&null]
int n = 4;//调用数组里的元素,可以写成a[变量]
printf("%d",arr[n]);//3
return 0;
}
函数调用操作符()
#include <stdio.h>
int ADD(int a, int b){//ab是形参
return a + b;
//也可以直接 return a + b;
}
int main(){
int num1 = 0;
int num2 = 0;
scanf("%d %d",&num1,&num2);//num1,num2是实参
int sum = ADD(num1,num2);//ADD(),调用函数,()就是函数调用操作符
printf("%d",sum);
return 0;
}
条件操作符【三目操作符】
#include<stdio.h>
int main(){
int a = 100;
int b = 20;
int r = a > b? a : b;//第一个是条件,满足,r = a,反之,r = b
printf("%d",r);
return 0;
}
指针
内存
内存会分成一个个的内存单元(一个内存单元大小1byte),每个内存单元都有自己的编号【地址,指针】
32位机器上,地址是三十二位,4byte
64……,8byte
之前声明数据类型很浪费
内存地址是2进制
太长了,用16进制打印
#include<stdio.h>
int main(){
int a = 10;
// &a;
printf("%p",&a);//打印地址用%p
return 0;
}
指针变量
存放地址的变量
#include<stdio.h>
int main(){
int a = 10;
// &a;
int* p = &a;//p就是指针变量
printf("%p",p);
printf("%p",&a);//二者等价
return 0;
}
解引用操作符*与取地址操作符&【一去一来,呼应】
通过*与&修改变量数值,但是地址不变
#include<stdio.h>
int main(){
int a = 10;
int* p = &a;//p就是指针变量
*p = 20;
printf("%d",a);//20
return 0;
}
指针变量大小
放地址的,只和机器位数有关
#include<stdio.h>
int main(){
printf("%d ",sizeof(char*));//4
printf("%d ",sizeof(int*));//4
printf("%d ",sizeof(float*));//4
printf("%d",sizeof(double*));//4
return 0;
}
结构体
.操作符
结构体对象.成员名
#include<stdio.h>
struct stu//一个类型
{
char name[20];
int age;
char sex[10];
char tele[12];
};//就像是盖房子的图纸
int main(){
struct stu s= {"zhangsan", 20, "man", 123457756};
printf("%s %d %s %d",s.name ,s.age ,s.sex ,s.tele);
return 0;
}
->箭头操作符
结构体指针变量 -> 成员名
#include<stdio.h>
struct stu//一个类型
{
char name[20];
int age;
char sex[10];
char tele[12];
};//就像是盖房子的图纸
void functionPrint(struct stu* ps){
printf("%s %d %s %d\n",(*ps).name ,(*ps).age ,(*ps).sex ,(*ps).tele);//啰嗦,与下面等价
printf("%s %d %s %d",ps->name ,ps->age ,ps->sex ,ps->tele);//箭头操作符
}
int main(){
struct stu s= {"zhangsan", 20, "man", 123457756};
functionPrint(&s);
return 0;
}
标签:10,main,return,int,鹏哥,C语言,初识,printf,include
From: https://www.cnblogs.com/GJ504b/p/18518581