1.如何理解变量
变量
就是编译器根据你所选择的数据类型开辟出的一块内存空间的一个名字代号
我在学习C语言指针的时候,一直都没搞明白别人讲的说变量代表开辟的那块内存空间,指针是指向那快内存空间的地址,我在想有了变量干嘛还需要地址呢,而且地址还需要解引用(*p)其实到这的时候是还不够明白变量的意思,我们在C语言里面学过变量分为局部变量和全局变量,局部变量是放在栈上的,全局变量是放在静态区的,还学了如何让自己来分配内存,用malloc,free在堆上开辟内存空间和释放内存,想到了这里我不由得联想起来变量,我们在创建变量的时候需要确定要创建的数据类型,编译器会根据我们创建这个变量的数据类型给我们对应的一块内存(比如:int a;//int在vs编译器里面是4个字节的空间)这个是编译器给我们分配的空间,根据我们创建在哪个区上面的内存进行系统的管理,而我们命名的变量名a就是代表了编译器给我们分配的内存空间,换而言之,变量a就是这块内存空间的代言人。
指针
什么叫指针呢?网络上说的很好说的是指针就是地址,但是啥又叫地址,不得不说了,地址在我们计算机中以16进制数保存,例如(0x11223344)地址是根据你的编译器用的多少位的机器来确定一个地址的大小是32bit还是64bit
既然都说了指针就是地址,我们可以清楚的知道一个指针是32bit(32位编译器)是固定不变的,不会因为你的数据类型而增多或减少,例:int* p,char* p,folat* p,他们的sizeof(p)都是为4个字节举一个例子
int a = 0;int* p= &a;*p= 10;
我们定义了一个整型变量a并初始化为0,取a的地址放在整型指针p里面,*解引用p再赋值为10。
这时候我们打印printf(''a = '',a);得到的值为10,我们通过解引用可以给a代表的那块内存空间进行赋值操作,那意味着什么呢,我将a所代表的那块空间的首元素地址赋值给了整型指针p,那我们通过p就可以找到a所代表的那块内存的首元素地址,我们知道指针就是存放一块内存的首元素地址,通过解引用才可以访问内存里存放的值,既然地址都一样,那解引用后就能进行赋值操作,改变a所代表那块空间的值。
有个疑问,变量能代表创建的内存,为啥还要用指针呢,那不是给自己找麻烦吗?
前面说的内容,指针占的内存空间只有4个字节(32位)在进行函数调用的时候,如果是传址它占的内存空间也只有4个字节,如果是传值那就需要看具体大小了,我们想啊,函数调用的时候,无论是传值还传址,都是有个实参有个形参,改变形参并不会改变实参,都是一样的,我们传址只是可以用解引用操作内存的值并不难改变实参的地址。
第一次写博客,只是发表我学习时候的困惑,和理解,希望可以和大家一起学习和探讨。