`
dylan.wu
  • 浏览: 134375 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

C/C++语言中sizeof对于数组的一点总结

阅读更多

最近在面试中被问到了几个有关sizeof的问题,自我感觉都回答对了,不过回来实际编写代码试了一下,发现还是错了一个地方,于是总结了一下。

栈中的数组

对于栈中的数组,sizeof给出的会是实际的数组长度,而非指针长度。

#include <string.h>
#include <stdio.h>

int main() {
    char a[5]= "blue";
    char b[ ] = "blue";
    char c[6] = "blue";
    printf("sizeof(a): %d\n", sizeof(a));
    printf("sizeof(b): %d\n", sizeof(b));
    printf("sizeof(c): %d\n", sizeof(c));
    return 0;
}
程序结果
sizeof(a): 5
sizeof(b): 5
sizeof(c): 6
 

指向数组的指针

当是一个指向数组(堆中,栈中或数据区的数组)的指针变量时,sizeof的结果将会是一个指针变量的长度,比如在32位机下将会是4.

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
    char ca[ ] = "blue1";
    char *a = "blue1";
    char *b = (char *)malloc(6 * sizeof(char));
    char *c = ca;
    strcpy("blue1", b);
    printf("sizeof(a): %d\n", sizeof(a));
    printf("sizeof(b): %d\n", sizeof(b));
    printf("sizeof(c): %c\n", sizeof(c));
    free(b);
    return 0;
}
    
程序结果
sizeof(a): 4
sizeof(b): 4
sizeof(c): 4

全局变量

对于全局变量中数组,sizeof的处理结果和在栈中的数组一样,会输出其实际的数组长度,而非一个指针变量的长度。对于全局变量中的指向数组的指针sizeof的处理方式为返回一个指针变量的长度。

#include <string.h>
#include <stdio.h>

char a[5]= "blue";
char b[ ] = "blue";
char c[6] = "blue";
char *d = "blue";
char *e = a;

int main() {
    printf("sizeof(a): %d\n", sizeof(a));
    printf("sizeof(b): %d\n", sizeof(b));
    printf("sizeof(c): %d\n", sizeof(c));
    printf("sizeof(d): %d\n", sizeof(d));
    printf("sizeof(e): %d\n", sizeof(e));
    return 0;
}

 

程序结果
sizeof(a): 5
sizeof(b): 5
sizeof(c): 6
sizeof(d): 4
sizeof(e): 4

函数参数

对于函数参数,无论是写成数组形式还是指针形式,sizeof都只会返回一个指针变量的长度。

#include <stdio.h>

void printsize1(char argv[]) {
    printf("%d\n", sizeof(argv));
 }

void printsize2(char *argv) {
    printf("%d\n", sizeof(argv));
}

int main() {
    char a[] = "blue1";
    char *b = "blue1";
    printf("printsize1(a): ");
    printsize1(a);
    printf("printsize2(a): ");
    printsize2(a);

    printf("printsize1(b): ");
    printsize1(b);
    printf("printsize2(b): ");
    printsize2(b);

    return 0;
}
    
 
程序结果
printsize1(a): 4
printsize2(a): 4
printsize1(b): 4
printsize2(b): 4
 
分享到:
评论

相关推荐

    C/C++ 动态数组的创建的实例详解

    在C++语言中,二维动态数组主要使用指针的方法建立,以建立一个整数二维数组为例: #include #include #include using namespace std; int main(int argc,char **argv) { ///*int a[2][3]={{1,2,3},{4,5,6}}; //...

    C/C++程序员面试指南.杨国祥(带详细书签).pdf

    C、C++语言是IT行业的主流编程语言,也是很多程序员必备的软件基本功,是软件开发行业招聘考查的重点。本书以流行的面试题讲解为主要内容,介绍了C、C++语言基本概念,包括保留字、字符串、指针和引用、结构体、...

    计算机语言中c/c++的基础入门学习代码记录(适应于计算机二级)

    8.指针(01sizeof运算符;02指针的定义和使用;03指针间接接触赋值;04指针作为函数参数;05数组名作为函数参数;06函数返回值为指针类型;07数组和指针;08指针数组;09多级指针) 9.结构体(01typedef语句;02...

    C/C++面试题目及解答.doc

    用C/C++语言写一函数完成该算法,给出复杂度 &lt;br&gt;6.对序列1、1、2、3、5、8、13。。。。 是Fab..数列 2、3、5、13...是Fab..质数数列,因为他们与自己前面的Fab...数列都互质 给出k,返回第k小的...

    探讨C++中数组名与指针的用法比较分析

    指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用。但是数组名有些地方又不同于指针。这里将数组名与指针用法的不同做一下总结(有些资料来自互联网),不妥之处,还望指正...

    现代C++程序设计

    1.1.2 C/C++是一门编译语言 1.1.3 为什么许多程序员都选择C++ 1.2 什么是面向对象 1.2.1 C++程序并不一定是面向对象的 1.2.2 一个简单的面向对象程序示例 1.2.3 面向对象的软件更有优势 1.3 结构化设计与面向对象...

    c++ 面试题 总结

    6.下面是C语言中两种if语句判断方式。请问哪种写法更好?为什么? int n; if (n == 10) // 第一种判断方式 if (10 == n) // 第二种判断方式 如果少了个=号,编译时就会报错,减少了出错的可能行,可以检测出是否少...

    《由浅入深学C++-基础、进阶与必做300题》pdf格式 (完整版 带目录

    本书适合所有想全面学习C++开发技术的人员阅读,尤其适合没有编程基础的C++语言初学者作为入门教程,也可作为大、中院校师生和培训班的教材,对于C++语言开发爱好者,本书也有较大的参考价值。 章节目录: 第1篇 ...

    【全新正版】现代C++程序设计(原书第2版)

    本书采用生动轻松的语言,深入阐述了C++语言和面向对象程序设计技术。书中设计了超过115个完整的经过教学测试的代码示例,不仅分析了这些示例的代码片段,而且还解释了如何把它们组成一个完整的程序。此外,各章后面...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

     ·使用visual c++ 2010支持的两种c++语言技术讲述c++编程的基础知识  ·分享c++程序的错误查找技术,并介绍通用的调试原则讨论每一个windows应用程序的结构和基本元素  ·举例说明如何使用mfc开发本地windows...

    C++ Primer第四版【中文高清扫描版】.pdf

    既显著改善了可读性,又充分体现了C++语言的最新进展和当前的业界最佳实践。书中不但新增大量教学辅助内容,用于强调重要的知识点,提醒常见的错误,推荐优秀的编程实践,给出使用提示,还包含大量来自实战的示例和...

    Visual C++ 2005入门经典--源代码及课后练习答案

     本书系编程语言先驱者Ivor Horton的经典之作,是学习C++编程最畅销的图书品种之一,不仅涵盖了Visual C++ .NET编程知识,还全面介绍了标准C++语言和.NET C++/CLI。本书延续了Ivor Horton讲解编程语言的独特方法,...

    非常经典的c++ primer视频教程6-10

    本课程是C++ Primer初级教程,课程内容是学习C++语言基础知识,对应着教材的第1章到第8章。 第1章 快速入门 1.1 编写简单的C++程序 1.2 初窥输入/输出 1.2.1 标准输入与输出对象 1.2.2 一个使用IO库的程序 ...

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

    对于中高级程序员,本书也是不可或缺的参考书。 目录 第1章 开始 1  1.1 编写一个简单的C++程序 2  1.1.1 编译、运行程序 3  1.2 初识输入输出 5  1.3 注释简介 8  1.4 控制流 10  1.4.1 while语句 10  ...

    C++开发工程师面试题库.docx

    * 在 C 语言中,一维数组名表示数组的首地址,是一个指针。 * 对于数组 `int num[5] = {1, 2, 3, 4, 5};`,`&num` 是指针的指针,表示数组的首地址。 * 强制转换 `*(int *)(&num + 1) - 1` 等同于 `num[4][0]`,即 `...

    -C++参考大全(第四版) (2010 年度畅销榜

    这是一本关于C++语言的百科全书,包括C和C++的命令、功能、编程和应用等方面的内容。全书分为五个部分:C++基础:C子集;C++的专有特征;标准函数库;标准C++类库;C++应用程序范例。详细描述和演示了定义C++语言的...

    C语言解析教程(原书第4版)(美) 凯利.pdf

    《c语言教程(原书第4版)》是一本优秀的c程序设计语言教材,完整描述了ansi c语言及其语法特性,并对c语言的高级特性和应用作了深入阐述,介绍了从c到c++和java过渡的相关知识。《c语言教程(原书第4版)》的一个...

Global site tag (gtag.js) - Google Analytics