承诺c指针 (1)指针是地址
(1)是地址
首先明白一个观点:指针就是地址。这是理解指针的起始一步。
直观感受下。变量的地址
int main()
{
int foo;
int *foo_p;
foo = 5;
foo_p = &foo;
printf(" foo...%d\n", foo);
printf("*foo_p...%d\n", *foo_p);
printf(" &foo...%p\n", &foo);
printf(" foo_p...%p\n", foo_p);
printf("&foo_p...%p\n", &foo_p);
return 0;
}
执行
几点说明:
- %p中的p是pointer(指针)的意思。专门用于打印指针变量中的内容。
- 有时看到用%x打印指针的。尽管结果一样,但含义全然不同。
%p:用合适的方式(通常是十六进制)输出指针变量中存放的还有一个变量的地址;%x:用十六进制的方式打印出变量的值。而且在我的环境中使用%x打印指针变量的话,会省略前面的0。
int main()
{
int foo = 5;
int *foo_p = &foo;
int **foo_pp = &foo_p;
printf(" foo...%d\n", foo);
printf(" &foo...%p\n", &foo);
printf(" foo_p...%p\n", foo_p);
printf(" &foo_p...%p\n", &foo_p);
printf(" *foo_p...%d\n", *foo_p);
printf(" foo_pp...%p\n", foo_pp);
printf("&foo_pp...%p\n", &foo_pp);
printf("*foo_pp...%p\n", *foo_pp);
printf("**foo_pp...%d\n", **foo_pp);
return 0;
}
执行
int main()
{
printf("sizeof(char)...%d\n", sizeof(char));
printf("sizeof(int)...%d\n", sizeof(int));
printf("sizeof(float)...%d\n", sizeof(float));
printf("sizeof(double)...%d\n", sizeof(double));
printf("sizeof(int*)...%d\n", sizeof(int*));
return 0;
}
在我的环境中,指针类型分配的大小是 sizeof(int*)=4;也就是说用4个字节的大小来存储变量的地址,这也是眼下大多数环境下的结果。以后讨论基于这个结果。
至于在c标准中,没有规定指针类型的大小,详细大小依靠详细的环境。
关于 sizeof
被误解为函数,可能是大多数情况下。我们都这样使用它:sizeof()。事实上这样用 sizeof 类型,如sizeof int也是能够的。
int main()
{
int foo;
int *int_p = &foo;
//在c中以下这句代码会给出警告,但可执行;而在c++中是会直接报错的
double *dou_p = &foo;
foo = 5;
printf("foo...%d\n", foo);
printf("int_p...%p\n", int_p);
printf("dou_p...%p\n", dou_p);
printf("*int_p...%d\n", *int_p);
printf("*int_p...%f\n", *int_p);
printf("*dou_p...%d\n", *dou_p);
printf("*dou_p...%f\n", *dou_p);
return 0;
}
执行
如4字节的int和相同4字节的float,所分配的空间大小一样,但能够表示的数据范围有非常大差距。详细存储方式,大家可查下。
%o —— 以无符号的八进制形式输出整数
%x —— 以无符号的十六进制形式输出整数
%u —— 以无符号的十进制形式输出整数
%c —— 以字符形式输出单个字符
%s —— 输出字符串
%f —— 以小数点形式输出单、双精度实数
%e —— 以标准指数形式输出单、双精度实数
%g —— 选用输出宽度较小的格式输出实数
版权声明:本文博主原创文章,转载,转载请注明出处。
承诺c指针 (1)指针是地址的更多相关文章
- 对象布局已知时 C++ 对象指针的转换时地址调整
在我调试和研究 netscape 系浏览器插件开发时,注意到了这个问题.即,在对象布局已知(即对象之间具有继承关系)时,不同类型对象的指针进行转换(不管是隐式的从下向上转换,还是强制的从上到下转换)时 ...
- Little-endian的一个好处:在变量指针转换的时候地址保持不变
Big-endian 的内存顺序和数字的书写顺序是一致的,方便阅读理解.Little-endian 在变量指针转换的时候地址保持不变,比如 int64* 转到 int32* 各有利弊,统一就好,目前看 ...
- 大一C语言学习笔记(7)---指针篇--什么是指针?什么是指针变量?取地址符“&”的作用是什么?地址运算符“*”的作用是什么,怎么理解两者?
"指针是C语言的灵魂"这句话一开始我没怎么明白,现在接触了指针,终于知道为什么这么说了,因为....难,真难:下面说一下我对这句话的见解: C语言拥有着其他语言所没有的特性---直 ...
- C与指针(结构体指针,函数指针,数组指针,指针数组)定义与使用
类型 普通指针 指针数组(非指针类型) 数组指针 结构体指针 函数指针 二重指针 定义方式 int *p; int *p[5]; int (*p)[5]; int a[3][5]; struct{.. ...
- C/C++:提升_指针的指针和指针的引用
C/C++:提升_指针的指针和指针的引用 写在前面 今天在使用指针的时候我发现了一个自己的错误.
- 理清C++常量指针和指针常量这团乱麻
写在前面: 与其说C++中的常量指针和指针常量是一块很有嚼头的语法糖,不如说它是一块相当难啃的骨头.其实本来没什么,这无非是const int *p与int* const p的区别, 但一涉及到起名字 ...
- 详解c++指针的指针和指针的引用
展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它.(这里说的指针的指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方 ...
- 【C语言入门教程】4.9 指向指针的指针
指针变量可以指向另一个指针变量,这种操作并不是将一个指针变量所指向的内存地址传递给另一个指针变量,而是定义一种指向指针类型的指针变量,可将其称为双重指针.双重指针的定义形式为: 数据类型 **变量名: ...
- 指针的指针&指向指针数组的指针
一.指针的指针 指针的指针看上去有些令人费解.它们的声明有两个星号.例如: char ** cp; 如果有三个星号,那就是指针的指针的指针,四个星号就是指针的指针的指针的指针 ...
随机推荐
- OCP解决问题053-16 MEMORY_TARGET
16.Setting which of the following initialization parameters enables Automatic Memory Management? A. ...
- UVa 524 Prime Ring Problem(DFS , 回溯)
题意 把1到n这n个数以1为首位围成一圈 输出全部满足随意相邻两数之和均为素数的全部排列 直接枚举排列看是否符合肯定会超时的 n最大为16 利用回溯法 边生成边推断 就要快非常多了 #inc ...
- mybaits使用存储过程
如何使用Mybaits调用数据库存储过程,按以下顺序Oracle案例库: 1.在数据库中创建以下存储过程: create or replace procedure pro_hello(p_result ...
- C++ Primer 学习笔记_45_STL实践与分析(19)--建筑常规算法
STL实践与分析 --泛型算法的结构 引言: 正如全部的容器都建立在一致的设计模式上一样,算法也具有共同的设计基础. 算法最主要的性质是须要使用的迭代器种类.全部算法都指定了它的每一个迭代器形參可使用 ...
- 解决visual studio空格变成很多点号的3种方法
在用visual studio做网站时不知道按了什么快捷键,所有页面上的空格都变成了点号,就像下图那样. 要解决空格变点号的方法有两种:1.编辑->高级->查看空白2.Ctrl+E 然后按 ...
- HR筒子说:程序猿面试那点事
小屁孩曾经有过4年的招聘经验,期间见识了各种类型的程序猿:有大牛.有菜牛:有功成名就,有苦苦挣扎不知方向.等后来做了一枚程序猿之后发现,HR眼中的程序猿和程序猿中的HR都是不一样的.有感与此,从HR的 ...
- zend studio 安装emmet(zen coding)
help->Install New Software 在work with后面点击Add,弹出的对话框中填写信息: Name:随意 Location:http://emmet.io/eclips ...
- Java经典23结构模型的设计模式(三)------附加代理模式、适配器型号、Facade模式的差异
本文介绍了7样的结构模型中的其余2种:轻量级.代理模式. 一.享元模式FlyWeight 享元模式比較简单且重要,在非常多场合都被用到.仅仅只是封装起来了用户看不到.其概念:运用共享内存技术最大限度的 ...
- (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
(1)首先创建java project 选择eclipse菜单上File->New->Java Project. 并命名为UploadFile. (2)加入必要的hadoop jar包 右 ...
- SQL -- 是否或推断线相交以在其内部的平面
SQL如下面: update mapping_nj_roads set municipality='227' from mapping_geodata_boundary a where a.suppo ...