别混淆了sizeof(数组名)和sizeof(指针)
我们在挨个儿输出一个数组中的元素时,最常用的就是用一个for循环来实现,简单了事。比如类似下面的代码片段:
for(i = 0; i< length; i++)
{
printf(“数组元素是%d”, 数组[i]);
}
用一个下标索引变量i来遍历整个数组,length是数组的长度。当然了,length得提前计算出来,计算的方式有很多,很多朋友会想到用sizeof计算。不过,sizeof好归好,但是也要睁大你的双眼,小心用错,你若不信,请继续往下看。
先看传统的做法,代码如下:
#include "stdio.h" int main(void)
{
int number[5] = {1,2,3,4,5};
int index = 0; printf("数组的元素分别是:\n");
for(index = 0;index < 5; index++)
{
printf("%d ", number[index]);
}
printf("\n"); return 0;
}
最简单的方法就是写死了数组长度,再用一个循环挨个儿输出。程序清晰易懂,结果是:
结果也是清晰易懂。有的朋友会突发奇想,为何不这样来做:
#include "stdio.h" int main(void)
{
int number[5] = {1,2,3,4,5};
int index = 0;
int *p = &number[0]; printf("数组的长度是: %d\n", sizeof(p)); printf("数组的元素分别是:\n");
for(index = 0;index < sizeof(p); index++)
{
printf("%d ", number[index]);
}
printf("\n"); return 0;
}
增加了一个指针变量p,指针变量p的初始值是数组首元素的地址。有的朋友企图用sizeof(p)来获取数组长度,这是不对的,请看结果:
从结果可以看到,sizeof(p)其实计算的是指针变量p的类型的大小。指针p的类型是指向整数类型的指针,因此其大小为4,所以这样做是不对的。(这段话有知友指出描述错误。作者在文末已作出更新。感谢这位知友。)
我还见过有朋友这样用sizeof的,代码如下:
#include "stdio.h" void print(int number[5])
{
int index = 0; ; printf("函数print中,数组长度是: %d ", sizeof(number)); printf("函数中数组的元素分别是:\n");
for(index = 0; index < sizeof(number) / sizeof(number[0]); index++)
{
printf("%d ", number[index]);
}
printf("\n");
} int main(void)
{
int number[5] = {1,2,3,4,5}; print(number); return 0;
}
这次代码又修改了一下,将数组名number传给函数print,并且print函数的形参看上去像是一个数组。运行结果是
诺诺,运行结果不是预期中的结果啊。其实,函数print形参看上去像是一个数组,于是有的朋友就会认为它就是一个数组,于是就发生了使用sizeof来计算数组长度;真实情况是print函数的参数还是一个指针,指针,指针,没错,就是一个指针,所以sizeof(number)计算的还是指针的大小。初学的朋友们一定要切记!
==========================2017年1月22日更新===============
感谢知友 梦人亦冷 指出文中描述的一个错误的地方。
文中描述有如下描述:
”从结果可以看到,sizeof(p)其实计算的是指针变量p的类型的大小。指针p的类型是指向整数类型的指针,因此其大小为4“
此处做如下更正:
”从结果可以看到,sizeof(p)其实计算的是指针变量p的大小。在32位系统上,不管指针p指向的是整型数据,还是字符型数据,short型数据,long型数据等,指针p本身所占的内存字节数均为4。也就是要使用4个字节的大小来存储变量p的值。“
别混淆了sizeof(数组名)和sizeof(指针)的更多相关文章
- sizeof数组名和字符指针是有区别的
sizeof数组名和字符指针是有区别的. #include <stdio.h> #include <stdlib.h> void change(char url[]); int ...
- sizeof(数组名)和sizeof(指针)
在做这道题时: 32位环境下,int *p=new int[10];请问sizeof(p)的值为()A.4 B.10 C.40 ...
- C语言 数组名不是指针
今天上计算机系统课的时候老师讲到了C中的聚合类型的数据结构.在解释数组名的时候说"数组名是一个指针,指向该数组的第一个元素",附上ppt(第二行): 我觉得这是不正确的,是一个常见 ...
- C/C++二维数组名和二级指针
转载 :https://blog.csdn.net/wu_nan_nan/article/details/51741030 作者:吴一奇 1. 指针1.1 一个指针包含两方面:a) 地址值:b) 所 ...
- c语言 数组名是常量指针
//数组名是常量指针 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include ...
- sizeof(数组名) 与 数组长度
int a[] = {1, 2, 3, 4}; cout << sizeof(a); //16 char b[] = "abc"; cout << size ...
- sizeof +数组名
链接:https://www.nowcoder.com/questionTerminal/daa5422cb468473c9e6e75cc98b771de 来源:牛客网 sizeof一个数组名称的时候 ...
- 别人不会给你说的---C语言中数组名和指针的区别 及 sizeof用法
引自: http://blog.csdn.net/tianyue168/article/details/5781924 #i nclude <iostream.h> int main( ...
- 比较分析与数组相关的sizeof和strlen
首先,我们要清楚sizeof是C/C++中的一个操作符,其作用就是返回一个对象或者类型所占的内存字节数. 而,strlen是一个函数,函数原型为: size_t strlen(const char * ...
随机推荐
- C# DataGridView合计行
在网上搜了很多关于DataGridView合计行的设计及源码,都不是很合我心意.于是自己写了一个关于合计行的DLL.以后每次要用到合计行的时候只要引用这个DLL就可以了. 效果图如下: 引用Dll: ...
- Android动画基础——属性动画(Property Animation)
本篇涉及例子下载:Github 本篇讲android 3.0引入的属性动画框架,上篇写视图动画View Animation时就说过ViewAnimation的缺点,那就是动画作用的是view本身的视觉 ...
- C#高性能大容量SOCKET并发(四):缓存设计
原文:C#高性能大容量SOCKET并发(四):缓存设计 在编写服务端大并发的应用程序,需要非常注意缓存设计,缓存的设计是一个折衷的结果,需要通过并发测试反复验证.有很多服务程序是在启动时申请足够的内存 ...
- 判断jQuery选择器结果为空 - CSDN博客
原文:判断jQuery选择器结果为空 - CSDN博客 jQuery选择器获取到的是一个对象,所以无论页面上存在或者不存在元素,这个对象都不为空.因此,如果要使用jQuery检查元素再给某个页面上是否 ...
- Qt-vs-addin失效的问题
Qt-vs-addin的小问题 使用Visual Studio进行Qt开发的时候,需要安装一个插件.然而有时候这个插件的一些工具却莫名其妙的失效: 其中qt5appwrapper.exe用于编辑Qt工 ...
- 可以用GetObjectProp来获取对象的属性
原来可以用GetObjectProp来获取对象的属性,还有这用法,哈哈哈哈…… var SL: TStrings; UseDBTools: Boolean;begin SL := nil; if Me ...
- C# winform 主界面打开并关闭登录界面
在winform 界面编程中,我们有时候要在主界面打开之前先显示登录界面,当登录界面用户信息校验正确后才打开主界面,而这时登陆界面也完成使命该功成身退了. 目前有两种方法可实现: 方法1. 隐藏登录界 ...
- XMLHttpRequest对象的属性与方法
XMLHttpRequest对象是Ajax的核心,它有很多属性和方法.1,readyState属性当一个XMLHttpRequest对象被创立后,readyState属性标示了当前对象处于什么状态,可 ...
- ASP.NET MVC3在Visual Studio 2010中的变化
在VS2010中新建一个MVC3项目可以看出与以往的MVC2发生了很明显的变化 1.ASP.NET MVC3必要的运行环境为.NET 4.0 (想在3.5用MVC3,没门!) 2.默认MVC3模板项目 ...
- sublimetext插件安装
sublimetext 一.下载地址: https://www.sublimetext.com/ 二.安装Package Control 方式一: Ctrl + Shift + P , 输入insta ...