第一个程序
#include <stdio.h> // #include 相当于Java的 import; stdio:standard input&output 标准的输入输出; .h:头文件的后缀 ; 包含一些函数(对应Java的方法)
#include <stdlib.h> // 导入标准的C语言函数库
system("pause"); //让docs命令行执行 pause 命令,作用是控制台停留
C语言基本类型
java基本数据类型和C语言的一些区别
1、java中的char类型的长度为2个字节,C语言中的char的长度为1个字节
2、java中的long类型的长度为8个字节,C语言中的long的长度为4个字节
因为C99标准规定:long类型的规定,不小于整型。
C99:为99年的标准
3、C语言中没有byte
4、C语言中没有boolean,if判断用 0(零)表示flase,非零表示true
signed:有符号:-128 ~ 127(表示一个数的正负) 记忆方法(= -2^7 ~ 2^7-1)
unsigned:无符号:0 ~ 255 (表示正数) 记忆方法(= 0 ~ 2^8-1)
void:无类型,代表任意类型
输出函数
输出函数要结合占位符
输出不同的内容要用不同的占位符
%d - int
%ld - long int
%c - char
%f - float
%u - 无符号数
%hd - 短整型
%lf - double
%x - 十六进制输出 int 或者long int 或者short int
%o - 八进制输出
%s - 字符串
printf(“你要输出的内容对应的占位符”);
在C语言中,默认保留小数点后六位
要想保留对应的位数,就需要在百分号后面加上“.数字”
输出函数
// scanf(“占位符”,内存地址);
scanf("%d",&i);
// 输入函数中不能加入换行符,如scanf("%d\n",&i);是不允许的
数组的中括号不能再左边(左边会报错)只能在右边
char[] cArray(报错)、char cArray[]
for循环的变量要定义在外面
int j;
for(j=0;j<5;j++){
// %c:内容
// cArray[%d]:动态的是第几个的 ,动态变化
printf("cArray[%d]=%c\n",j,cArray[j]);
}
互换两个数
/**
内存地址不同,操作的是不相同的值,所以a和b的值没有交换,sitch的局部变量的a和main方法里的a是不相同的内存地址
*/
void sitch(int a,int b){//传值无法改变值
int temp = a;
a = b;
b = temp;
printf("sitch方法中a的地址=%#x\n",&a);
printf("sitch方法中b的地址=%#x\n",&b);
}
// 能够装地址的为指针变量
// int* a:int类型的指针变量
void sitch2(int* a,int* b){//传地址可以改变值
// 指的是3000H这个地址中1000H地址中的值(100)
int temp = *a;
// 把a变量对应地址的值 修改成 b变量对应地址的值
*a = *b;
// 把b变量对应地址的值 修改成 temp
*b = temp;
printf("sitch2方法中a的地址=%#x\n",a);
printf("sitch2方法中b的地址=%#x\n",b);
printf("\n");
}
函数返回一个以上的值
#include <stdio.h>
#include <stdlib.h>
/**
返回多个值
通过内存地址修改对应的值,实现了间接返回多个值
*/
// 返回了多个值,因为C语言使用了指针(指针就是对应的内存地址,直接去取值就可以了,不用传值,因此这就是C语言高效的原因)
// int* a:a存放的值为 main函数里的 a的内存地址
// int* b:b存放的值为 main函数里的 b的内存地址
// int* a,int* b为形参
void colse(int* a,int* b){
// 直接操作地址对应的值
*a = 0;
// 取 b 变量存储的地址的值,赋值为 0
*b = 0;
}
main(){
// 一键关闭 GPS 和 Wifi
// 1 代表的是开,0 代表是关闭
int a = 1;
int b = 1;
// 可是这里没有返回值(void),为什么返回多个值呢?
// 因为使用的是内存地址
// colse方法修改了对应地址的值,所以值改变了,因此不用返回值
// &a,&b为实参
colse(&a,&b);
printf("a=%d\n",a);
printf("b=%d\n",b);
system("pause");
}
指针
#include <stdio.h>
#include <stdlib.h>
/**
指针就是内存地址
内存地址就是指针
*/
main(){
int i =100;
int* p = &i;
//第一个实验: 如果修改 i 值, p值有变化吗?
// 修改i值前,p的值时:0x60fef8
// 修改i值后,p的值时:0x60fef8
// 得出的结果为不变
// 当我们在次打印p的值时,虽然i的值变为200了,但是是打印p的值,打印p的值与i的值(100,200),没有关系。
/**
printf("修改i值前,p的值时:%#x\n",p);
i =200;
printf("修改i值后,p的值时:%#x\n",p);
//第二个实验: 如果修改 p 值, i值有变化吗?
// 修改 p 的话是修改地址值,所以定义 int j = 200;
// 结果如下:
// 修改p值前,i的值时:100
// 修改p值后,i的值时:100
/**
printf("修改p值前,i的值时:%d\n",i);
int j = 200;
p = &j;
printf("修改p值后,i的值时:%d\n",i);
*/
//第三个实验: 如果修改 i 值, *p值有变化吗?
// *p对应的是int类型的占位符
/**
printf("修改i值前,*p的值时:%d\n",*p);
i =200;
printf("修改i值后,*p的值时:%d\n",*p);
*/
//第四个实验: 如果修改 *p 值, i值有变化吗?
printf("修改*p值前,i的值时:%d\n",i);
// 把地址对应的值改变了
*p = 200;
printf("修改*p值后,i的值时:%d\n",i);
system("pause");
}
多级指针
#include <stdio.h>
#include <stdlib.h>
/**
多级指针
指针指向的是内存地址
地址就是指针
*/
main(){
// 定义一个int类型的变量 i,并且赋值为100;
int i = 100;
// 定义一个int类型的一级指针变量 address1,并且把 i的地址赋值给它
int* address1 = &i;
// 定义一个int类型的二级指针变量 address2,并且把 address1对应的地址赋值给它
// 二级指针指的还是地址,只是指向的地址变了(变为一级指针)
int** address2 = &address1;
// 定义三级指针
int*** address3 = &address2;
// 定义四级指针
int**** address4 = &address3;
// 取的是一个地址
printf("***address4的地址=%#x\n",***address4);
// 多级指针取值 ****address4得到的值是100
printf("****address4的值=%d\n",****address4);
// *address4(一个 * 的时候相当于取地址对应的值,相当于分析图中 3000H)
// 进行值的修改,与一颗 * 的指针是类似的原理
****address4 = 2000;
printf("****address4的值=%d\n",****address4);
system("pause");
}
数组
#include <stdio.h>
#include <stdlib.h>
/**
数组的介绍
1、数组的取值
2、数组的取地址
3、数组是一块连续的内存空间
4、数组的首元素的首地址和数组的地址相同
5、数组的设计
*/
main(){
char cArray[] = {'H','E','L','L','O'};
int iArray[] = {1,2,3,4,5};
// 取数组的值
printf("cArray[0]=%c\n",cArray[0]);
printf("cArray[1]=%c\n",cArray[1]);
printf("\n");
printf("iArray[0]=%d\n",iArray[0]);
printf("iArray[1]=%d\n",iArray[1]);
printf("\n");
// 数组的首元素的首地址和数组的地址相同 (&cArray和&cArray[0]的地址相同)
printf("cArray地址=%#x\n",&cArray);
printf("\n");
// 取内存地址值
// char占 1 个字节
// 内存是一块连续的内存空间
printf("cArray[0]地址=%#x\n",&cArray[0]);
printf("cArray[1]地址=%#x\n",&cArray[1]);
printf("cArray[2]地址=%#x\n",&cArray[2]);
printf("\n");
// 数组的首元素的首地址和数组的地址相同 (&cArray和&cArray[0]的地址相同)
printf("iArray地址=%#x\n",&iArray);
printf("\n");
// int占 4 个字节
// 16进制 10 为 a
// 内存是一块连续的内存空间
printf("iArray[0]地址=%#x\n",&iArray[0]);
printf("iArray[1]地址=%#x\n",&iArray[1]);
printf("iArray[2]地址=%#x\n",&iArray[2]);
printf("iArray[3]地址=%#x\n",&iArray[3]);
printf("\n");
// 用指针取值(因为数组是一块连续的内存空间,内存空间就为地址)
printf("iArray=%d\n",*iArray);
// iArray+0:得到一个过后在 加上一个下标,因为数组是一块连续的内存空间,加上一个下标相当于跳到下一个
printf("iArray[0]=%d\n",*iArray+0);
printf("iArray[1]=%d\n",*iArray+1);
printf("iArray[2]=%d\n",*iArray+2);
printf("iArray[3]=%d\n",*iArray+3);
printf("\n");
// 另外一种取法 (正规的做法)
// (iArray+0):加上一个坐标在去取值,相当于根据下标去取值(这种是根据下标去取值)
printf("iArray[0]=%d\n",*(iArray+0));
printf("iArray[1]=%d\n",*(iArray+1));
printf("iArray[2]=%d\n",*(iArray+2));
printf("iArray[3]=%d\n",*(iArray+3));
system("pause");
}
数组的特点
加 1 就可以取 0x28ff14 这个值了(后面一样的操作)