"深入理解C语言" 指针
本文对coolshell中的"深入理解C语言"这篇文章中提到的指针问题, 进行简要的分析.
#include <stdio.h>
int main(void){
int a[];
printf("%x\n", a);
printf("%x\n", a + );
printf("%x\n", &a);
printf("%x\n", &a + );
return ;
}
假设a的地址是:0Xbfe2e100, 而且是32位机,那么这个程序会输出什么?
#1: 第一条printf语句应该没有问题,就是 bfe2e100
#2: 第二条printf语句你可能会以为是bfe2e101。那就错了,a+1,编译器会编译成 a+ 1*sizeof(int),int在32位下是4字节,所以是
加4,也就是bfe2e104。【a为指向int类型数据的指针】
#3: 第三条printf语句可能是你最头疼的,我们怎么知道a的地址?我不知道吗?可不就是bfe2e100。那岂不成了a==&a啦?这怎么可
能?自己存自己的?也许很多人会觉得指针和数组是一回事,那么你就错了。如果是 int *a,因为a是指针,所以&a是指针的地址,a和
&a不一样。但是这是数组啊a[],所以&a其实是被编译成了&a[0]。
#4: 第四条printf语句就很自然了,就是bfe2e104。还是不对,因为是&a是数组,被看成int(*)[5],所以sizeof(a)是5,也就是
5*sizeof(int),也就是bfe2e114。【&a可以理解为指向int [5]类型的指针,即a为数组类型】
Reference:
深入理解C语言: http://coolshell.cn/articles/5761.html
"深入理解C语言" 指针的更多相关文章
- 深入理解C语言 - 指针使用的常见错误
在C语言中,指针的重要性不言而喻,但在很多时候指针又被认为是一把双刃剑.一方面,指针是构建数据结构和操作内存的精确而高效的工具.另一方面,它们又很容易误用,从而产生不可预知的软件bug.下面总结一下指 ...
- 深入理解C语言 - 指针详解
一.什么是指针 C语言里,变量存放在内存中,而内存其实就是一组有序字节组成的数组,每个字节有唯一的内存地址.CPU 通过内存寻址对存储在内存中的某个指定数据对象的地址进行定位.这里,数据对象是指存储在 ...
- 小强版之无码理解C语言指针
1. 先从普通变量开始 2. 撸完变量撸指针 3. 故事情节进一步发展,此处少儿不宜 4. 奶茶妹妹捉奸,小强死定了 5. 源码欣赏 #include <stdio.h> ...
- 理解C语言中指针的声明以及复杂声明的语法
昨天刚把<C程序设计语言>中"指针与数组"章节读完,最终把心中的疑惑彻底解开了.如今记录下我对指针声明的理解.顺便说下怎样在C语言中创建复杂声明以及读懂复杂声明. 本文 ...
- 这样子来理解C语言中指针的指针
友情提示:阅读本文前,请先参考我的之前的文章<从四个属性的角度来理解C语言的指针也许会更好理解>,若已阅读,请继续往下看. 我从4个属性的角度来总结了C语言中的指针概念.对于C语言的一个指 ...
- 对C语言指针的理解
一个小程序引发对于C语言指针的思考: #include <bits/stdc++.h> using namespace std; void my_swap (int* a,int* b) ...
- C语言指针转换为intptr_t类型
1.前言 今天在看代码时,发现将之一个指针赋值给一个intptr_t类型的变量.由于之前没有见过intptr_t这样数据类型,凭感觉认为intptr_t是int类型的指针.感觉很奇怪,为何要将一个指针 ...
- C语言-指针
C指针基础知识 C语言中,指针无疑是最令人头疼的.今天无事就来学学C语言的指针,在此留下点笔记,仅供个人参考. 首先要搞懂的是,指针是什么? 指针:是用来存放内存地址的变量. 不管是什么类型的指针,存 ...
- [转]C语言指针学习经验总结浅谈
指针是C语言的难点和重点,但指针也是C语言的灵魂 . 这篇C语言指针学习经验总结主要是我入职以来学习C指针过程中的点滴记录.文档里面就不重复书上说得很清楚的概念性东西,只把一些说得不清楚或理解起来比较 ...
随机推荐
- iOS的isnan函数
假设一个数是一个确定的数.那它就不是nan值 假设一个数是无穷大,无穷小.那它就是nan值 我试着打印了下面的值是不是nan值 if (isnan(1)) { DLog(@"1是NAN&qu ...
- cpu分析简介
进程占用CPU过高,一般有以下两种原因: 1. 业务量过大导致进程处理负荷高,占用CPU资源:2. 程序BUG导致,比如死循环: 初步查看cpu占用情况top进一步 ...
- Cmder 配置使用
官网下载 配置: 1.把 Cmder 加到环境变量 将Cmder.exe存放的目录添加到系统环境变量path 添加成功后,Win+r 输入cmder,可以正确打开cmder 窗口即可. 2.添加 cm ...
- Ultra-QuickSort - poj 2299 (归并排序+统计逆序数)
利用归并排序统计逆序数,利用归并求逆序在对子序列s1和s2在归并时(s1,s2已经排好序),若s1[i]>s2[j](逆序状况),则逆序数加上s1.length-i,因为s1中i后面的数字对于s ...
- go的map获取对应的key-value
场景: IP是个Key,string字符串是个值, 一个IP可以对应多个字符串. 代码如下: package main import ( "fmt" ) func main() { ...
- asp.net c#采集需要登录页面的实现原理及代码
当我们采集页面的时候,如果被采集的网站需要登录才能采集,原理搞清楚了,就好办了,我们所要做的仅仅是在采集的时候(或者说HttpWebRequest提交数据的时候),将Cookie信息放入Http请求头 ...
- Javascript间歇调用和超时调用
间歇调用:每隔指定的时间就执行一次代码 超时调用:在指定的时间过后执行代码 HTML Code 12345678910111213141516171819 <!DOCTYPE html& ...
- SQL.Cookbook 读书笔记3 操作多个表
第三章 操作多个表 表连接的内连接和外连接 A表 B表id name id name 1 a 1 b 2 b 3 c4 c内连接就是左表和右表相同的数据,查询结果只有相等的数据:select * fr ...
- Docker学习(2Docker基本命令 )
1.首先我们需要明确在docker中需要了解的一些基础知识 Docker虚拟化有三个概念需要理解,分别镜像.容器.仓库. 1) 镜像:docker的镜像其实就是模板,跟我们常见的ISO镜像类似,是一个 ...
- hdu1829(A Bug's Life)
题目链接:传送门 题目大意:有n个昆虫,有m组关系,接下来m行表示两个昆虫性别不同,问是否有矛盾情况(同男同女) 题目思路:并查集的高级应用,开两倍数组大小,后n个数组表示和当前昆虫不同性别的集合 # ...