c指针类型的作用
指针类型的作用
- 任何类型的指针占用的空间大小都是相同的(32位CPU是4字节;64位CPU是8字节)
- 既然任何类型的指针占用的空间大小都是相同的,为什么指针还需要类型呢?指针只是指向了一个内存地址,但是当存内存中取值的时候,系统不知道你要从当前指针指向的地址,取几个字节,指定了指针的类型后,系统就知道取几个字节了。char类型取1个字节,short类型取2个字节,int类型去4个字节。
#include <stdio.h>
int main(){
int i = 123456789;//i的值用16进制表示就是:0x075bcd15
char *c = (char*)&i;
printf("char:%d\n", *c);//打印出21,因为是char类型的指针,所以去1个字节,也就是去的是16进制的15,十进制就是21.
short *s = (short*)&i;
printf("short:%d\n", *s);//打印出-13035,因为是char类型的指针,所以去2个字节也就是去的是16进制的cd15,十进制就是-13035
int *pi = &i;
printf("int:%d\n", *pi);//打印出123456789
}
(gdb) p/a i
$4 = 0x75bcd15
(gdb) p 0x15
$6 = 21
(gdb) p/a -13035
$3 = 0xffffffffffffcd15
- 指针的加减法运算,也是和指针类型绑定的。对一个没有类型的指针做加1,系统是不知道移动几个字节的,所以必须有类型。int类型的指针值加1后,指针移动4个字节,char类型的指针值加1后,指针移动1个字节,double类型的指针值加1后,指针移动8个字节。下面的例子虽然是同一个地址加1,但是得到的地址完全不同。
#include <stdio.h>
int main(){
int *p = (int*)0x7fffffffe1e4;
printf("int p=%p, p+1=%p\n", p,p+1);//int p=0x7fffffffe1e4, p+1=0x7fffffffe1e8
char *c = (char*)p;
printf("char p=%p, p+1=%p\n", c,c+1);//char p=0x7fffffffe1e4, p+1=0x7fffffffe1e5
short *s = (short*)p;
printf("short p=%p, p+1=%p\n", s,s+1);//short p=0x7fffffffe1e4, p+1=0x7fffffffe1e6
double *d = (double*)p;
printf("double p=%p, p+1=%p\n", d,d+1);//double p=0x7fffffffe1e4, p+1=0x7fffffffe1ec
int ar[10] = {0};
int (*pa)[10] = &ar;
//pa是10个元素的int数组的指针,所以pa+1后,就移动了40(4*10)个字节
printf("ar[10] p=%p, p+1=%p\n", pa,pa+1);//ar[10] p=0x7fffffffe1b0, p+1=0x7fffffffe1d8
}
(gdb) p 0xd8-0xb0
$3 = 40
c指针类型的作用的更多相关文章
- (七)C语言中的void 和void 指针类型
许多初学者对C中的void 和void 的指针类型不是很了解.因此常常在使用上出现一些错误,本文将告诉大家关于void 和void 指针类型的使用方法及技巧. 1.首先,我们来说说void 的含义: ...
- C51指针类型和存储区的关系详解
一.存储类型与存储区关系 data ---> 可寻址片内ram bdata ---> 可位寻址的片内ram idata ---> 可寻址片内ram ...
- C++------------typedef 函数指针类型定义
摘要bycrazyhacking: typedef 是定义了一种"函数指针"类型,可以再声明很多变量.函数指针的定义是定义了一个变量. int max(int x,i ...
- C语言的通用指针类型(void *)
reference: https://blog.csdn.net/cumirror/article/details/4631701 https://blog.csdn.net/Lee_Shuai/ar ...
- C++类指针类型的成员变量的浅复制与深复制
本篇文章旨在阐述C++类的构造,拷贝构造,析构机制,以及指针成员变量指针悬空问题的解决.需要读者有较好的C++基础,熟悉引用,const的相关知识. 引言: 类作为C++语言的一种数据类型,是对C语言 ...
- void类型和void *指针类型(网上摘抄总结)【转】
http://www.blogjava.net/fhtdy2004/archive/2009/07/09/286004.html 现在在学linux编程过程中遇到很多void *指针类型,由于c很早学 ...
- Qt中容器类应该如何存储对象(最好使用对象指针类型,如:QList<TestObj*>,而不要使用 QList<TestObj> 这样的定义,建议采用 智能指针QSharedPointer)
Qt提供了丰富的容器类型,如:QList.QVector.QMap等等.详细的使用方法可以参考官方文档,网上也有很多示例文章,不过大部分文章的举例都是使用基础类型:如int.QString等.如果我们 ...
- C++中void和void*指针的含义 (指针类型的含义)
转载自:http://blog.csdn.net/lee_shuai 指针有两个属性:指向变量/对象的地址和长度,但是指针只存储地址,长度则取决于指针的类型:编译器根据指针的类型从指针指向的地址向后寻 ...
- golang(3):strings和strconv使用 & 时间和日期类型 & 指针类型 & 流程控制 & 函数
strings和strconv使用 . strings.HasPrefix(s string, prefix string) bool: // 判断字符串s是否以prefix开头 . . string ...
随机推荐
- Oracle数据库over函数的使用
转自: https://blog.csdn.net/a1065423444/article/details/75635611 over()函数写法over(partition by expr2 or ...
- [总结] 动态DP学习笔记
学习了一下动态DP 问题的来源: 给定一棵 \(n\) 个节点的树,点有点权,有 \(m\) 次修改单点点权的操作,回答每次操作之后的最大带权独立集大小. 首先一个显然的 \(O(nm)\) 的做法就 ...
- Linux tee的花式用法和pee
1.tee多重定向 tee [options] FILE1 FILE2 FILE3... tee的作用是将一份标准输入多重定向,一份重定向到标准输出/dev/stdout,然后还将标准输入重定向到每个 ...
- maven安装、配置及创建工程
准备工作 java开发环境(JDK) maven下载地址:http://maven.apache.org/release-notes-all.html 一.安装 安装maven超级简单,总共分三步: ...
- @property详解,@property修饰符以及各个修饰符区别(上)
相信很多参加过面试的人员很多都会被问到:weak与assign的区别,copy与strong的区别.如果你仅仅说一点点copy一般对NSString,weak对于控件的修饰,assign对于基本类型, ...
- 49.Linux-wpa_cli使用之WIFI开启,扫描热点,连接热点,断开热点,WIFI关闭(49)
本章学习内容: 1.WIFI如何开启 2.扫描热点 3.连接热点 4. 断开热点 5.关闭WIFI 本节使用的是wpa_supplicant工具,它主要包含wpa_supplicant(命令行模式)与 ...
- 【LInux】查看Linux系统版本信息
一.查看Linux内核版本命令(两种方法): 1.cat /proc/version [root@S-CentOS home]# cat /proc/versionLinux version 2.6. ...
- IntelliJ IDEA生成live template(代码模板)
IntelliJ IDEA生成live template(代码模板) 一.进入live template模板 快捷键:Ctrl+Shift+A进入Find Action,输入live template ...
- Java基础-一文搞懂位运算
在日常的Java开发中,位运算使用的不多,使用的更多的是算数运算(+.-.*./.%).关系运算(<.>.<=.>=.==.!=)和逻辑运算(&&.||.!), ...
- 字符串方法之padStart和padEnd
ECMAScript 2017 有两个新的字符串方法:padStart和padEnd; 很有用啊啊,不用写if判断啦!开心脸 padStart在字符串开始出填充,padStart(num,‘要填充的 ...