C语言学习系列文章目录-指针和结构体专题
文章目录
一、指针储存的样子
指针储存在内存中就像是这样一个个格子,并且每个格子都有编号,每个格子都有一定大小 |
---|
– |
– |
– |
– |
– |
– |
– |
– |
– |
计算机内存的编号方式
我们常见计算机32位和64位,这个32和64是指n根地址线,是物理的真实存在的物理线,可以通电的那种,传输1/0高低电平数据的;
此时我们就可以获得将电信号转换成数字信息的方式也就是1/0组成的二进制序列;
那么由0/1的组成的编号就能组成内存单元的地址了也就是232/64了,每个内存单元分配一个地址,从而就是232个内存单元;
再根据bit和byte和kb的关系就能算出来内存大小;
当然不可能一个比特就分配一个地址,否则就会很小很小;
以32位且每个比特位分配一个地址为例子
232共有这么多个地址,也就是有这么多个bit
换算成byte
换算成kb
换算到mb
显然内存是小且不够用的,所以不会用一个bit一个地址的方式了;
考虑到不够用,因而最后我们将一个字节当作一个内存单元、分配一个地址,因而一个地址是8bit,一个地址是1byte
二、指针的设置
int a = 10;
printf("%p",&a);//%p是专门打印地址的;
int * pa=&a;//pa是用来存放地址的,也就是所谓的指针变量
//*说明pa是指针变量
//int说明pa指向的执行对象是int类型
char arr;
char *parr=&arr;
特别的这里的指针是可以存放自身的地址;但是他是会有类型差异的譬如如下
int *pa=*pa;//会显示int*和int**存在变量类型差异
三、指针的用法和用处
int a = 10;
int * pa = &a;
*pa = 20;//*就是解引用的操作,*pa就是通过pa的地址从而找到a,再更改a的值
四、指针的大小
通过sizeof的函数我们就可以知道指针的大小是多少了;事实上结果都是大小为4byte(32位就是32bit-4byte、同样的64bit的则是8byte),指针的大小是相同的,这是因为指针本身只是指向地址的,因而无论指针指向的内容是什么,指针本身只是一个门牌号并不决定开门之后有多少个人;
五、结构体
struct就是结构体用的关键字,通过初始化结构体对象来实现自定义类型;譬如可以创建如下的类型(类似int、double等等的类型);
struct student
{
char name[20];
int age;
double score;
}
int main()
{
struct student a = {"zhangsan",20,80.5};//结构体创建和初始化
a.age=21;//更改年龄为21岁
printf("%s %d %lf",a.name,a.age,a.score);//a.name就是结构体变量的成员变量;
struct student * pa = &a;//*pa是结构体的地址
printf("%s %d %lf",(*pa).name,(*pa).age,(*pa).score);//*解引pa指向的对象;
printf("%s %d %lf",pa->name,pa->age,pa->score);
//pa->指向的对象;
//箭头指针到这个结构体下面的成员变量名;
//注意左边是指针右边是成员变量名
return 0;
}
总结
这个章节着重复习了指针的使用,接下去就是结构体了,结构体比较简单一些,指针和结构体一般会套着用,好像出题也蛮多的;总体就是理解*的用法,然后就是了解指针的意义和内存的处理方式;