聊聊 sizeof 运算
在这两次的课上,同学们已经学到了数组了。下面几节课,应该就会学习到指针。这个速度的确是很快的。
对于同学们来说,暂时应该也有些概念理解起来可能会比较的吃力。
先说一个概念叫内存的错误访问。对应的运行错误可能是段错误等。同学们暂时脑海中有这个概念而不用深究。
内存的访问错误,多数情况下都是数组和指针导致的。这里简单的说下如何使用sizeof
运算符避免数组中的错误访问。
假设有这样的一个数组,char a[11]
,之前,如果想要将这个数组填充满,大家可能使用这样的做法:
for(int i = 0;i < 11;i++)
{
a[i] = i;
}
但是,要是哪天小手一抖,或者是一些其他的情况,比如忽然发现,哎a
本来是想要存储helloworld
的,
可以存下,但是我现在要存储hello
,要不我将a
设置的小一点,比如char a[6]
。这时候,如果不更改这个for
循环,就会出现尴尬的问题,for
循环会继续去尝试访问a[6...10]
,而实际上,并不存在。
假如使用sizeof
运算符,就可以很好的避免这一尴尬的事情发生。以上的for
循环代码就变成了:
for(int i = 0;i < sizeof(a)/sizeof(a[0]);i++)
{
a[i] = i;
}
(其实以上的代码稍微有点多此一举。)
这里, 简单的说下sizeof
运算符的用法:
- sizeof(字面量):它将会尽量的匹配这个尝试,比如如果字面量是
1
,它试图理解为int
,如果字面量是3.14
,它试图理解为一个float
,如果是"helloworld"
,则试图理解为一个字符串。
#include<stdio.h>
int main(){
printf("%d %d %d\n",sizeof(1),sizeof(3.14),sizeof("helloworld"));
return 0;
}
// 结果分别为 4 8 11(64 位系统,64 位编译器)
- sizeof(类型):如果传递进去的是数据的类型,则返回这个类型的字节宽度。
#include<stdio.h>
int main(){
printf("%d %d %d\n",sizeof(char),sizeof(int),sizeof(float));
return 0;
}
// 结果分别为 1 4 4(64 位系统,64 位编译器)
- sizeof(指针):返回系统指针的空间大小。比如在 32 位系统中,指针的宽度是 4 字节,在 64 位系统中,是 8 字节。这里需要扩展一个东西,就是当函数的参数是数组的情况。实际上,当一个函数的参数中存在数组,实际上将会退化为一个指针,那么在这个函数中进行 sizeof 运算时,实际上和求指针的长度别无二致。
#include<stdio.h>
int getsize(char a[]){
return sizeof(a);
}
int main(){
char a[10] = "hello";
char *ap = a;
int *b;
*b = 10;
printf("%d %d %d %d\n",sizeof(a),sizeof(ap),sizeof(b),getsize(a));
return 0;
}
// 10 8 8 8(64 位系统,64 位编译器)
最后一段代码,对于当前的同学们来说是没有办法理解的,同学们仅需要有一个印象,等学习到后面的课程再行理解。
聊聊 C 语言中的 sizeof 运算的更多相关文章
-
C语言中的位运算和逻辑运算
这篇文章来自:http://blog.csdn.net/qp120291570/article/details/8708286 位运算 C语言中的位运算包括与(&),或(|),亦或(^),非( ...
-
C/C++语言中的位运算
在计算机程序中,数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作. 一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效率.C语 ...
-
C语言 malloc()与sizeof运算的盲点
//malloc()与sizeof运算的盲点 #include <stdio.h> #include <stdlib.h> #include <string.h> ...
-
C语言中的位运算的技巧
一.位运算实例 1.用一个表达式,判断一个数X是否是2的N次方(2,4,8,16.....),不可用循环语句. X:2,4,8,16转化成二进制是10,100,1000,10000.如果减1则变成01 ...
-
聊聊Java语言中的单例
package com.xinke.mybatis.test; public class TestSingleton { private static TestSingleton ts = null; ...
-
C语言中的模运算-hdu6124(打表,找规律)
题目链接:https://vjudge.net/problem/HDU-6124 题目描述: 题目大意就是给你一个数,判断这个数 % 其它数后共有几种结果. 这题对我来说最大的难点是我不太知道每个数 ...
-
C语言中的指针运算
int a[5]={1,2,3 ,4,5} *p=a; *p++ 等价于*(p++) 等价于a[i++](i++ i首先会被使用任何进行自+) *++p等价于*(++p) 等价于 a[++i] (++ ...
-
【转】C语言中整型运算取Ceiling问题
原文:http://blog.csdn.net/laciqs/article/details/6662472 --------------------------------------------- ...
-
C语言中复数运算及调用blas,lapack中复数函数进行科学计算
C语言中常用的数据类型主要int, float ,double ,char 等,但在科学运算中复数扮演着重要角色.这里讲下C语言中的复数运算以及如何调用blas,lapack库中的复数函数来进行科学计 ...
随机推荐
-
Hibernate-模板模式
在我的博客<Hibernate总结(一)>在对数据库的增删改查前后重复的使用了得到Session与关闭Session等操作,因此我想到了模板设计模式. 模板设计模式概述: 定义一个操作中的 ...
-
js对象常用2中构造方法
//js 对象的构造方法通常有2中情况: //第一种是通过json对象构造 var persion={ name:"孙悟空", age:40, eat:function () { ...
-
即时通讯 TCP UDP
TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信! ...
-
android自定义控件实例(Linearlayout组合TextView和ImageView)
2013-12-18 11:25:22 转载自: http://www.open-open.com/lib/view/open1328836804515.html 很多时候android常用的控件不能 ...
-
C++中extern “C”含义深层探索
C++中extern “C”含义深层探索 extern “C” 是一个双向都需要用到的语法表示,就是说在cpp引用c头文件,或者c引用cpp文件时都需要用到.但extern “C” 永远只能在cpp引 ...
-
Tools for Presention
ZoomIt v4.5 http://technet.microsoft.com/en-us/sysinternals/bb897434.aspx 微软的教师演示工具 主要有放大,画图,倒计时的功能. ...
-
java基础概念
jre是java运行环境 jdk是java开发工具包 java源文件←编译class字节码文件←运行结构
-
jQuery实例化的优势,为什么要有实例化,到底实例化后在解决什么问题?
jQuery实例化对象的方法相比于普通方法 优势: 1.不需要出现大量的new关键字. 2.可实现链式写法. 3.书写更方便 实例化的原因: 1.实例化有利于管理程序中不同的DOM选择和处理(不同的选 ...
-
hdu 5195 DZY Loves Topological Sorting 线段树+拓扑排序
DZY Loves Topological Sorting Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/sho ...
-
常用工具说明--Maven使用说明
什么是Maven? 如今我们构建一个项目需要用到很多第三方的类库,如写一个使用Spring的Web项目就需要引入大量的jar包.一个项目Jar包的数量之多往往让我们瞠目结舌,并且Jar包之间的关系错综 ...