初识c语言
一,数据类型
先来运行一段代码,求出每种数据类型的字节长度
#include <stdio.h> int main() { printf("sizeof(char)=%d\n", sizeof(char)); //字符数据类型 printf("sizeof(short)=%d\n", sizeof(short)); //短整型 printf("sizeof(int)=%d\n", sizeof(int)); //整形 printf("sizeof(long)=%d\n", sizeof(long)); //长整型 printf("sizeof(long long)%d\n", sizeof(long long)); //更长的整形 printf("sizeof(float)=%d\n", sizeof(float)); //单精度浮点数 printf("sizeof(double)=%d\n", sizeof(double)); //双精度浮点数 printf("sizeof(long double)=%d\n", sizeof(long double)); return 0; }
运行结果如图
二,变量常量
1.变量的作用域
1). 局部变量的作用域是变量所在的局部范围。
2). 全局变量的作用域是整个工程。
2.变量的生命周期
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
1). 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
2). 全局变量的生命周期是:整个程序的生命周期。
3.常量
C语言中的常量和变量的定义的形式有所差异,C语言中的常量分为以下以下几种:
1).字面常量
2).const 修饰的常变量
3).#define 定义的标识符常量
4).枚举常量
三,字符串
这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字 符串。
注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串 内容。
举例
#include<stdio.h> int main() { char arr1[] = "abc" char arr2[] = { 'a', 'b', 'c' }; char arr3[] = { 'a', 'b', 'c','\0' }; printf("%s\n", arr1); printf("%s\n", arr2); printf("%s\n", arr3); return 0; }
输出结果如下:
为什么会出现这样的结果呢?原因是这样的
char arr1[] = “abc”;//字符串的结束标志是一个 \0,后面是有一个\0,打印的时候停了下来
char arr2[] = { ‘a’, ‘b’, ‘c’ }; //没有\0结束不了,t的后面是什么不知道,会输出随机值
char arr3[] = { ‘a’, ‘b’, ‘c’,’\0′ ; //有结束标志\0,程序会停下来
对程序进行调试,结果如下,可以看的更加清楚了。
可知数组arr1中有4个元素,arr2有3个元素,arr3中有4个元素。
四,转义字符
我列举了几个常用的转义字符:
\\ 用于表示一个反斜杠,防止它被解释为一个转义序列符。
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
\ddd ddd表示1~3个八进制的数字。 如: \130 //130表示这个8进制数字转化为十进制后的ascii码值对应的字符
\xdd dd表示2个十六进制数字。 如:\x30 //30表示这个十六进制数转化为十进制后ascii码值对应的字符
举一个很有趣的例子:
#include <stdio.h> int main() { printf("c:\code\test.c\n"); return 0; }
大家猜一猜运行结果是什么呢,它是这样的:
原因就是 \t作为一个水平制表符,所以运行结果就不会显示\t了。
五,操作符
1.算术操作符
+ – * / %
2.移位操作符
<< >>
3.位操作符
按位与 & :只有对应的两个二进位都为1时,结果位才为1;0则为0
按位或|:有一则为一,同时为0才为0
按位异或 ^: 相同为0 ,相异为1
4.赋值操作符
= += -= *= /= &= ^= |= >>= <<=
5.单目操作符
! 逻辑反操作
– 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位
) ~ 对一个数的二进制按位取反
— 前置、后置–
++ 前置、后置++
后置++ ,先使用,再加加
int a=10;
b=a++;
a= 11;b=10;
前置加加,先++,再使用
int a=10;
b=++a;
a= 11;b=11;
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
关系操作符
!= 用于测试“不相等”
== 用于测试“相等”
逻辑操作符
1、逻辑运算符是根据表达式的值来返回真值或是假值。在C语言中没有专门的真值和假值,认定非0为真值,0为假值。
2、逻辑运算符运算规则:
|| 或:两个条件中,只要有一个成立,则结果就成立;
&& 与:两个条件中,两个同时成立,则结果成立,否则不成立;
对于 ~这个操作符,可以再来写一段代码:
#include<stdio.h> int main() { int a=0; printf("%d",~a); return 0; }
运行之后,发现输出结果为 -1
那为什么会是这样的结果,来简单看一下
首先需要知道 :
-1的原码
1000000 0000000 0000000 00000001
反码
1111111 1111111 1111111 11111110
补码
1111111 1111111 1111111 11111111
其次a=0,
00000000 00000000 00000000 00000000 (32个0)
取反-》
11111111 11111111 11111111 11111111
内存谈的是补码 ,这个是内存里的补码 ,进行减一取反,得到
10000000 00000000 00000000 00000001
就会发现这个是 -1了。
六,关于static的作用
1.修饰局部变量,使生命周期变长
include <stdio.h> void test() { int i = 0; i++; printf("%d ", i); } int main() { int i = 0; for(i=0; i<10; i++; { test(); } return 0;
}
结果如下:
#include <stdio.h> void test() { static int i = 0; i++; printf("%d ", i); } int main() { int i = 0; for(i=0; i<10; i++) { test(); } return 0; }
结果如下;
2. 修饰全局变量,让他只能在当前的原文件下使用,改变了作用域(链接属性)
3.修饰函数(改变了作用域(链接属性)),(由外到内)
七,define 定义常量和宏
define 定义常量 :没有参数
define 定义宏:有参数
八,关键字
auto :声明自动变量
break:跳出当前循环
case:开关语句分支
char :声明字符型变量或函数返回值类型
const :声明只读变量
continue:结束当前循环,开始下一轮循环
default:开关语句中的“默认”分支
do :循环语句的循环体
double :声明双精度浮点型变量或函数返回值类型
else :条件语句否定分支(与 if 连用)
enum :声明枚举类型
extern:声明变量或函数是在其它文件或本文件的其他位置定义
float:声明浮点型变量或函数返回值类型
for:一种循环语句
goto:无条件跳转语句
if:条件语句
int: 声明整型变量或函数
long :声明长整型变量或函数返回值类型
register:声明寄存器变量
return :子程序返回语句(可以带参数,也可不带参数)
short :声明短整型变量或函数
signed:声明有符号类型变量或函数
sizeof:计算数据类型或变量长度(即所占字节数)
static :声明静态变量
struct:声明结构体类型
switch :用于开关语句
typedef:用以给数据类型取别名
unsigned:声明无符号类型变量或函数
union:声明共用体类型
void :声明函数无返回值或无参数,声明无类型指针
volatile:说明变量在程序执行中可被隐含地改变
while :循环语句的循环条件
九,指针
这里先简单介绍一下关于指针的一些知识:
内存:划分为三个区域,栈区(局部变量,形式参数),堆区(动态内存分配,malloc,calloc,realloc,free),静态区(全局变量,静态变量)
内存是电脑上特别重要的存储器,计算机中所有程序的运行都是在内存中进行的 。
所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地 址。
32位机器
32根地址线/数据线
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000001
00000000 00000000 00000000 00000011
…
10000000 00000000 00000000 00000000
…
11111111 11111111 11111111 11111111
共有2^32个编号
#//取出num的地址 printf(“%p\n”, &num);//打印地址,%p–以地址的形式打印
打印第一个字节的地址,最起始位的地址
那地址如何存储,需要定义指针变量。
int num = 10;
int *p;//p为一个整形指针变量
p = #
*p//解引用操作符
指针大小在32位平台是4个字节,64位平台是8个字节。
与类型无关。
十,结构体
struct Stu { char name[20];//名字 int age; //年龄 char sex[5]; //性别 char id[15]; //学号 };
struct Stu s = {"张三", 20, "男", "20180101"};//打印结构体信息
printf("name = %s age = %d sex = %s id = %s\n", s.name, s.age, s.sex, s.id);//.为结构成员访问操作符
//->操作符struct Stu *ps = &s;
printf(“name = %s age = %d sex = %s id = %s\n”, ps->name, ps->age, ps->sex, ps>id);
以上是关于c语言一些模块简单的排版与介绍,Enjoy It,本文到此结束,谢谢!