一、变量
前辈,上一节你提到了int和变量,那么变量究竟是什么呢?
变量嘛,顾名思义,就是随时可以改变的量
比如说,在上一节写的代码中我们给内存a赋予了"10"这个数值,其实我们还可以随时改变内存a的数值,所以我说a是一个变量
int a = 10 ; //申请一段内存空间,大小为int,内存名为a,内存的值为10
//也可以说定义了一个int大小的变量a
a = 20 ; //变量a的值修改为20
哦哦!那么我们只要想定义一个变量,就在前面用"int"修饰就行了吧?
不完全正确哦~实际上,不只是int,我们还可以用short,long,float,double......来定义一个变量哦
呃呃(w(゚Д゚)w),这些都是什么啊?
知道整数,小数,负数,字母吗?
当然知道啊!(恼~当我是弱智吗?QAQ)
嗯,short,long,float,double......这些关键字,就是用来存储不同类型的数据(整数,小数,负数,字母)的,简称数据类型
前辈!C语言为什么要有不同的数据类型?所有的变量都是一个万能类型不可以吗?
理论上当然可以!但是考虑到实际应用,不同类型的数据存储空间是不一样的,有的数据就不需要那么大的存储空间,所以我们给它一个小的存储空间就可以了!
所以说,使用不同的数据类型可以帮助我们合理规划内存空间,小的数据就放到小的内存里,大的数据就放到大的内存里。
原来是这样!可以具体讲讲有哪些数据类型吗?
好的,我们接下来讲解C语言的基本数据类型
二、基本数据类型
C语言的基本数据类型总结如下表:
我给你一段代码,用来判断数据类型的大小
//方法一:直接判断数据类型的大小
printf("sizeof(int) = %d\n", sizeof(int)) ;
//方法二:定义一个数据类型的变量,打印这个变量的大小,间接验证数据类型的大小
int a ; //定义一个int类型的变量a,但不赋值
printf("sizeof(int) = %d\n", sizeof(a)) ;
其中,sizeof()函数是一个内建函数,用于获取特定类型或对象在内存中的大小。它的参数可以是数据类型或者是一个具体的数据对象。好了,你写代码去验证一下表中所有数据类型的大小吧!
好的,前辈~我这就去做!
呼,终于敲完了,果然和表中的数据一模一样!!!
#include <stdio.h>
#include <stdbool.h> //引入stdbool.h头文件,可以使用bool类型
int main()
{
printf("sizeof(int) = %d\n",sizeof(int));
printf("sizeof(short) = %d\n",sizeof(short));
printf("sizeof(long) = %d\n",sizeof(long));
printf("sizeof(float) = %d\n",sizeof(float));
printf("sizeof(double)= %d\n",sizeof(double));
printf("sizeof(char) = %d\n",sizeof(char));
printf("sizeof(bool) = %d\n",sizeof(bool));
printf("sizeof(void) = %d\n",sizeof(void));
printf("sizeof(int*) = %d\n",sizeof(int*));
printf("sizeof(short*) = %d\n",sizeof(short*));
printf("sizeof(long*) = %d\n",sizeof(long*));
printf("sizeof(float*) = %d\n",sizeof(float*));
printf("sizeof(double*)= %d\n",sizeof(double*));
printf("sizeof(char*) = %d\n",sizeof(char*));
printf("sizeof(bool*) = %d\n",sizeof(bool*));
printf("sizeof(void*) = %d\n",sizeof(void*));
return 0;
}
干的漂亮!以上的代码充分的验证了C语言常见数据类型的大小,以后不论遇到什么样的数据类型,都可以使用此方法来验证!
三、地址
诶?~前辈,我看到指针类型int*,short*,long*,float*......的大小怎么都是8个字节?!!
没错!其实它们不是用来存放数据的,而是用来存放内存的地址的,所谓的地址,就是用来告诉我们,这段内存在整个内存中的位置!比如int*类型,专门存放int类型的地址;float*类型,专门用来存放float类型的地址。
呃~感觉好抽象啊。。。
没事儿~我们运行一段代码并进行剖析,你就知道了,用"&"符号可以获取变量的地址
#include <stdio.h>
int main()
{
int a ; //定义一个int类型的变量a
float b ; //定义一个float类型的变量b
int* pa = &a ; //定义一个指针变量pa,给它赋值为变量a的地址
float* pb = &b ; //定义一个指针变量pb,给它赋值为变量b的地址
printf("&a = %p\n", &a) ; //打印变量a的地址
printf("pa = %p\n", pa) ; //打印指针变量pa的值(变量a的地址)
printf("&b = %p\n", &b) ; //打印变量b的地址
printf("pb = %p\n", pb) ; //打印指针变量pb的值(变量b的地址)
return 0;
}
根据上面的实验,我们可以看到,指针变量pa、pb没有自己的数值,而是分别专门存放变量a和变量b的地址。
由于int和float都是4字节大小,所以变量a的地址和变量b的地址之间,间隔了4个字节。
啊?指针变量只是用来存放与其同类型变量的地址?也太鸡肋了吧?!?
NoNoNo其实指针变量可以通过其存放的地址值,间接的获得该地址对应变量的值!这也是指针变量的强大之处!
什么(捂嘴)?到底怎样做到的啊?
哈哈!我给你放一段代码就懂了,通过指针变量获取其指向变量的值,需要用到" * "符号
#include <stdio.h>
int main()
{
int a = 10 ; //定义一个int类型的变量a,并赋值为10
float b = 3.14 ; //定义一个float类型的变量b,并赋值为3.14
int* pa = &a ; //定义一个指针变量pa,给它赋值为变量a的地址(pa指向a)
float* pb = &b ; //定义一个指针变量pb,给它赋值为变量b的地址(pb指向b)
printf("*pa = %d\n", *pa) ; //通过"*"获取pa指向的变量a的值
printf("*pb = %f\n", *pb) ; //通过"*"获取pb指向的变量b的值
return 0;
}
原来还有这种操作!!!那我们可以通过指针变量修改其指向的变量的值吗?
当然可以!你也学会举一反三了~看下面的一段代码,我们尝试通过指针来修改其所指向变量的值:
#include <stdio.h>
int main()
{
int a = 10 ; //定义一个int类型的变量a,并赋值为10
float b = 3.14 ; //定义一个float类型的变量b,并赋值为3.14
int* pa = &a ; //定义一个指针变量pa,给它赋值为变量a的地址(pa指向a)
float* pb = &b ; //定义一个指针变量pb,给它赋值为变量b的地址(pb指向b)
*pa = 20 ; //通过"*"获取pa指向的变量a的值,把a的值修改为20
*pb = 6.28 ; //通过"*"获取pb指向的变量b的值,把b的值修改为6.28
printf("a = %d\n", a) ; //打印变量a的值
printf("b = %f\n", b) ; //打印变量b的值
return 0;
}
今天也学了不少的内容了,帮你回顾一下:
(1)变量指的是任意时刻可以修改数值的一段内存。
(2)我们通过不同的数据类型来定义不同的内存段的大小,给不同的数据以合适的数据类型,合理规划内存空间。
(3)C语言常见的数据类型有:整数(整型,短整型,长整型),小数(单精度浮点型,双精度浮点型),字母(字符型),布尔型,无类型,指针类型。
(4)指针类型是一种比较特殊的类型,它专门用来存放特定类型的变量的地址,使用"&"符号可以获取变量的地址,使用"*"符号可以获取指针所指向的变量的值。
感谢前辈的贴心总结!我再去好好消化消化~~~
[end]