记得第一次接触C语言的时候,还是大学的第一学期,那时候对编程几乎没有什么概念,总觉得每天学C这玩意好像和现实中的编程差距很大,基本上都是控制台来打印信息等,和现实中的可视化软件几乎打不着边际 ,也就忽略了C的重要性。
工作了后,做JNI开发也用到一些,随着工作方向的变动,慢慢就放弃了这些看似简单却非常重要的基础知识,现在静下心来准备让自己彻底放空,来重游技术的海洋。
好了,我们今天就开始C语言的基础学习了。
前言
库的引用:
下面是C程序入库的固定结构,需要引入系统库的 .h文件
#include <stdio.h>
int main() {
return 0;
}
说明:
1)使用“< > ”尖括号引用库,是指自动寻找系统库的头文件;
2)使用 " " 双引号,是指自动寻找我们自己定义的头文件;
第一点: 基础数据类型和占位符输出
#include <stdio.h>
int main() {
/**
* 1、基本数据类型的占位输出
*/
int i = 100;
double d = 200.001;
float f = 300;
long l = 400;
short s = 500;
char c = 'c';
//字符串
char *str = "hello world";
printf("int类型占位 i = %d \n", i);
printf("double类型的占位: d = %lf \n", d);
printf("float类型的占位: f = %f \n", f);
printf("long类型的占位: l = %d \n", l);
printf("short类型的占位: s = %d \n", s);
printf("char类型的占位: c= %c \n", c);
printf("字符串的占位: str = %s \n", str);
return 0;
}
运行输出结果如下:
数据类型和占位符.png说明:
1)字符串的输出是用指针来表示,占位符是 %s
- double类型的占位符用%d有些场景也是可以的,但是会丢失double类型的数据精度,所以建议使用准确的占位符来进行占位
第二点:获取字节数 sizeof 的使用
#include <stdio.h>
int main() {
/**
* 获取内存字节数 sizeof来获取字节数
*/
int number = 100;
printf("int 类型占用的字节数:%d\n", sizeof(number));
printf("int 类型占用的字节数:%d\n", sizeof(int));
return 0;
}
说明:
1)在使用 sizeof 获取数据类型的字符数时,可以直接传入一个类型,同样也可以输入类型变量;
第三点:指针
#include <stdio.h>
int main() {
int point=200;
printf("输出point的内存地址:%p\n\n",&point);
//此处如果用指针的占位符来输出变量的值,则会输出16进制数据
printf("输出point的内存地址:%p\n\n",*(&point));
int* point_p=&point;
printf("指针变量的大小:%d\n\n",sizeof point_p);
printf("point_p指针所指的内存地址中的值是:%d\n\n",*point_p);
//通过指针来修改变量的值
*point_p=300;
printf("通过指针来修改变量的值:%d\n\n",point);
return 0;
}
输出结果:
指针的使用.png说明:
1) 指针的输出使用 %p 作为占位输出;
2)在变量名前使用&来获取变量的内存地址;
3)在声明变量的数据类型后跟一个 * ,代表声明的是一个数据类型的指针;
4)在指针变量前面使用,用于取出指针变量所指的内存地址中的内容;*
5)指针变量只有有数据类型,是因为在读取指针所指向的内存地址的内容时,系统可以知道取多少个字节的数据;
6)指针的size和数据类型没有关系,和操作系统的位数有关系;
第四点:C中的自定义函数
#include <stdio.h>
//下面的三个函数需要在main函数之前实现,如果是在main函数下面实现,则需要在main函数上面进行声明
void changeValueValid(int* i){
*i=888;
}
//此函数是无法修改传入的变量的数据,因为形参和传如的变量的内存地址是不一样的
void changeValueInvalid(int i){
printf("输出形参i的内存地址:%p\n",&i);
i=999;
}
//使用指针来进行交换两个数据
void switchValues(int* number1,
int* number2){
int temp = *number1;
*number1=*number2;
*number2=temp;
}
int main() {
int org=666;
printf("原数据变量的内存地址:%p\n",&org);
changeValueInvalid(org);
printf("chang函数执行前的org的值是:%d\n",org);
changeValueValid(&org);
printf("chang函数执行后的org的值是:%d\n",org);
printf("*********************\n\n");
int number1 = 123;
int number2= 456;
printf("通过指针交换 前 两个数据的值:number1=%d,number2=%d\n",number1,number2);
switchValues(&number1,&number2);
printf("通过指针交换 后 两个数据的值:number1=%d,number2=%d\n",number1,number2);
return 0;
}
输出结果:
自定义函数的使用.png说明:
1)C语言不允许函数重载;
2)C语言是面向过程的语言,所以在使用C语言的函数时,如果函数写在main函数下面,就需要在main函数上面进行声明;
3)想要在自定义函数中修改main函数中变量的值,由于C语言中函数的进栈和弹栈会导致修改无效,则需要使用指针来修改内存地址中的值来完成修改;
最后,很多人在学习C语言的过程中,被指针这个玩意整的云里雾里的,无法自拔,今天笔者把自己对指针的认知分享一下,希望有所帮助:
1)指针 就是内存地址;
2)指针变量:其实就是内存地址的一个别名,可以理解为就是一个变量,只不过他的值是内存地址;
3)指针类型:其实指针的数据类型就是用来取出指针所指内存地址里面的数据时使用的;
网友评论