C学习日记 指针 2020-04-18


一个字节是八个比特,所以int在内存中占据32个比特





如果要输出一个变量的地址应该用%p



将i的地址取出来强制变为 int 类型,赋给 p ,其结果和直接取 i 地址出来是一样的

这个结果是在32位的架构下得出的



在64位架构下sizeof(int)是4个字节

而sizeof(&i)这个地址取出来是8个字节


在32位架构下sizeof(int)是4个字节

而sizeof(&i)这个地址取出来是4个字节


地址和整数并不永远相同,这和我们用的架构是有关的


&运算符必须是对一个变量取地址,如果&右边不是一个变量,则不能用&取地址

得有一个明确的变量才能对它取地址



68和6c在16进制下相差4


在C语言中,存储本地内存的地方叫堆栈stack

存储时是自上而下的,所以先定义的变量在上面



两个数组单元之间的差距是4,而且相邻的数组之间的差距永远是4


取地址后把地址交给一个整数,这种方法不见得正确

因为地址的类型不一定能和整数的类型对得上


一个指针类型的变量就是一个保存取出来的地址的变量

* 就代表着是一个指针

* p 就代表p是一个指针,它指向的是这个int,现在我们把这个 i 的地址交给了这个 p



p 里面的值是 i 的地址,这时候我们就说 p 指向了 i



这两行的意思是一样的,都是定义了一个指针 *p 和一个普通的 int 型变量 q

我们并不是把 * 加给了 int 我们是把 * 加给了 p

在C语言中并没有 int* 这种类型

若要表达 p 和 q 都是指针,则要写成 int *p,*q;



指针变量里面只会有别的变量的地址而不是别的变量的值






p 指向 i ,说明 p 能访问 i ,访问即可以对 i 进行读和写

而如果只是普通的变量赋值,则得到的是 i 中的值,而不能对 i 产生什么影响




此时 *p 作为一个整体它是一个整数


在经历了f函数之后, i 的值被改了

p 的值是 i 的地址, *p 就代表了 i ,所以我们能修改 i 的值


scanf以为输入的就是一个地址,所以编译不一定会出错,但是运行一定会出错

因为scanf把值写到了 6 那个地方,而那个地方很小,而且有很重要的东西




其实在函数里面的数组就是指针




不是说这两种类型是等价的,而是说它们在参数表中出现的出现的时候是等价的


p [0] 是指它所指向的值作为数组第一个位置的值



一个数组变量是一个常量指针,所以这个数组变量不能被赋值,两个数组变量之间也不能相互做赋值





最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容