在学习指针的时候,得到指针的定义和数组的定义一样,但是这时候就很好奇,指针只是一个地址,那数组和指针一样的话,sizeof时怎么得知其长度呢。

于是百度了下面的回复:

千万不要把数组名看成指针,尽管有些时候他们是相通的,但也仅限某些时候而已。

sizeof是一个奇特的函数,告诉你你也许不相信——sizeof在编译的时候就已经确定sizeof的结果了,这有点类似于宏。

char str[] = “Hello” ;
sizeof ( str );//输出为6

编译器编译的时候根据上下文完全知道str是一个数组,sizeof (str ) = 6 理所当然是在求数组所占字节数,这个字节数在编译期间就可以确定(数组的大小必须在编译前指定好,C语言规定)

void *p = malloc(  );
sizeof ( p );//输出为4

编译器看到p是个指针,可是谁能保证指针所指内存的大小呢?尽管你这里写着100,但是malloc可是动态分配,没人敢保证malloc一定返回100个字节,甚至比如你不调用malloc,调用一个自己写的函数,编译器总之是无法在编译期间就确定指针所指内存大小的,而sizeof又必须在编译期间知道结果,那好,sizeof只好返回指针本身所占内存的大小,32位机上是4个字节,64位机上是8个字节。

void Func ( char str[]) {
sizeof( str ); //输出为4
}

数组作为参数时,编译器在编译期间一律编译为指针,这样尽管你定义str为数组,实际上在编译器眼里后等同于:

void Func ( char * str) {
sizeof( str );//输出为4
}

数组作为参数时,一律被编译器编译为指针。

sizeof 数组与指针的更多相关文章

  1. sizeof数组名和字符指针是有区别的

    sizeof数组名和字符指针是有区别的. #include <stdio.h> #include <stdlib.h> void change(char url[]); int ...

  2. 计算结构体、数组、指针的sizeof

    1. 结构体的sizeof 题目: sturct aa{ in num; char name[10];}; struct bb{ int a; float b; struct aa c;}; stru ...

  3. sizeof 数组名字,数组指针

    int *a = new int[15]; sizeof(a)//在64位机器上,8 sizeof(a)/sizeof(int) //2 ----- int a[15]; sizeof(a)//15* ...

  4. 《征服 C 指针》摘录3:数组 与 指针

    一.数组 和 指针 的微妙关系 数组 是指将固定个数.相同类型的变量排列起来的对象. 正如之前说明的那样,给指针加 N,指针前进“当前指针指向的变量类型的长度 X N”. 因此,给指向数组的某个元素的 ...

  5. C语言学习004:数组与指针

    在C语言中,字符串实际上就是字符数组,在内存中字符串"Shatner"存储的形式是这样的

  6. C/C++ 一段代码区分数组指针|指针数组|函数指针|函数指针数组

    #include<stdio.h> #include<stdlib.h> #include<windows.h> /* 举列子说明什么是函数指针 */ //以一个加 ...

  7. C语言学习笔记之成员数组和指针

    成员数组和指针是我们c语言中一个非常重要的知识点,记得以前在大学时老师一直要我们做这类的练习了,但是最的还是忘记了,今天来恶补一下.     单看这文章的标题,你可能会觉得好像没什么意思.你先别下这个 ...

  8. C++中的数组与指针

    数组与指针看起来很像 int a[] = {1, 2 ,3}; int *p = a; 如此,我们可以p[0], p[1], p[2] 看起来,与直接使用数组名没什么两样,但是看这段代码 sizeof ...

  9. c数组与指针

    0.数组和指针并不是相同的 我们声明数组时,同时分配了一些内存空间,用于容纳数组元素,但是当我们声明一个指针时,只分配了用于容纳指针本身的内存空间. 从这个方面也可以理解sizeof后面跟数组名和指针 ...

随机推荐

  1. laravel使用的模板引擎 blade

    使用blade引擎的话必须在控制器中使用use   Blade

  2. 用ping让对方电脑堵塞瘫痪

    用ping让对方电脑堵塞瘫痪2008-04-27 11:32 定义echo数据包大小. 在默认的情况下windows的ping发送的数据包大小为32byt,我们也可以自己定义它的大小, 但有一个大小的 ...

  3. android 上下左右手势判断 根据别人的改的

    GestureUtils.java package com.gesture; import android.content.Context;import android.util.DisplayMet ...

  4. php 不等待返回的实现方法(异步调用)

    PHP异步执行的常用方式常见的有以下几种,可以根据各自优缺点进行选择: 1.客户端页面采用AJAX技术请求服务器优点:最简单,也最快,就是在返回给客户端的HTML代码中,嵌入AJAX调用,或者,嵌入一 ...

  5. 邁向 RHCE 之路 (Day26) - Apache 網頁伺服器

    本篇將在 SELinux 安全機制及 IPTables 防火牆開啟的環境下實作,分別實作簡單網頁服務及虛擬主機 Virtual Host 設定,最後則是實作網頁中需要保護網頁時可以透過 .htacce ...

  6. 使用Sigar获取服务器信息

    Sigar简介 Sigar是Hyperic-hq产品的基础包,是Hyperic HQ主要的数据收集组件.它用来从许多平台收集系统和处理信息. 这些平台包括:Linux, Windows, Solari ...

  7. MySQL防止delete命令删除数据

    在sql中删除数据库中记录我们会使用到delete命令,这样如果不小心给删除了很难恢复了,总结一些删除数据但是不在数据库删除的方法. 方法一 我常用的做法,就是在数据库中加一个删除标识字段,如: is ...

  8. atitit.按钮光标滑过高亮切换以及其他动态效果的实现css html js --attilax总结

    atitit.按钮光标滑过高亮切换以及其他动态效果的实现css html  js --attilax总结 4. 鼠标越过动态图片切换实现 1 4.1. 优先模式::css模式... 1 4.2. 其次 ...

  9. location 禁止以/data开头的文件

    [root@web01 default]# tree data/ data/ └── index.html directories, file [root@web01 default]# cat da ...

  10. spring配置:context:property-placeholder 读取配置文件信息 在配置文件中使用el表达式填充值

    spring将properties文件读取后在配置文件中直接将对象的配置信息填充到bean中的变量里. 原本使用PropertyPlaceholderConfigurer类进行文件信息配置.Prope ...