指针、数组与sizcof运算符

(1)sizeof是c语言的一个运算符(主要sizeof不是函数,虽然用法很像函数),sizeof的作用是用来返同()里面的变量或者数据类型占用的内存字节数。

(2)sizeof存在的价值?主要是因为在不同平台下名种数据类型所占的内存字节数不尽相同(譬如int在32位系统中为4字节,在16位系统中为2字节)。所以程序中需要使用sizeof来判断当前 变量/数据类型 在当前环境下占几个字节。

(3)strlen是一个C库函数,用来返同一个字符串的长度(注意,字符串的长度是不计算字符串末尾的'\0'的)。一定要注意strlen接收的参数必须是一个字符串。(字符串的特征是以'\0'结尾)

#include <stdio.h>
#include <string.h> int main()
{
char str[] = "hello";
printf("sizeof(str) = %d\n",sizeof(str)); //字符串的所占的内存空间是6个字节
printf("sizeof(str[0]) = %d\n",sizeof(str[])); //字符串首元素所占的内存空间就是一个字节
printf("strlen(str) = %d\n",strlen(str)); //字符串的长度是不包括最后一位的'\0',所以长度是5 return ;
}

在这里顺便再来普及一下字符数组和字符串的常识性问题,其实C语言中并不存在字符串这个数据类型,而是使用字符数组来保存字符串。

#include <stdio.h>
#include <string.h> int main()
{
char str0[] = {'h','e','l','l','o'};  //字符数组      char str1[] = "hello";          //字符串
        printf("sizeof(str0) = %d\n",sizeof(str0));  //
printf("sizeof(str1) = %d\n",sizeof(str1)); //
}

我们在gcc编译器下得到的编译结果如下图所示

所以

char str0[] = {'h','e','l','l','o'};   等价于    char str0[] = {'h','e','l','l','o'};
char str1[] = "hello";    等价于 char str1[] = "hello";  

好,我们继续来说sizeof的问题

#include <stdio.h>
#include <string.h> int main()
{
char str[] = "hello";
char *p = str; printf("sizeof(p) = %d\n",sizeof(p)); //p是指针变量,32位系统中所有指针所占的内存空间都是4,不管是什么类型的指针,相当于sizeof(char* )= 4
printf("sizeof(*p) = %d\n",sizeof(*p)); //*p是P所指向的那个内存空间里存储的内容,数组名所表示的是一个数组的首地址,
                              //也可以理解成数组首元素的地址,所以*p的内存空间就是1,相当于sizeof(char) = 1
printf("strlen(p) = %d\n",strlen(p)); //相当于strlen(str) = 5
}

gcc编译结果如下图所示,前三行p和str和&str[0]的地址都是一样的

#include <stdio.h>
#include <string.h> int main()
{
int a = ; printf("sizeof(a) = %d\n",sizeof(a));
printf("sizeof(int) = %d\n",sizeof(int));
}

sizeof测试一个变量本身,和sizeof测试这个变量的类型,结果是一样的。gcc编译结果如下图所示,结果都是4

#include <stdio.h>
#include <string.h> int main()
{
int b[]; printf("sizeof(b) = %d\n",sizeof(b)); //100*sizeof(int) }

sizeof (数组名)的时候,数组名不做左值也不做右值。纯粹就是数组名的含义。那么sizeof(数组名)实际返回的是整个数组所占用内存空间(以字节为单位的)

#include <stdio.h>
#include <string.h> void func(int b[])
{
printf("sizeof(b) = %d\n",sizeof(b));
}
int main()
{
int a[];
func(a); //4,因为a在func内部就是指针,而不是数组
}

(1)函数传参,形参是可以用数组的

(2)函数形参是数组时,实际传递是不是整个数组,而是数组的首元素首地址。也就是说函数传参用数组来传,实际相当于传递的是指针指针指向数组的首元素首地址)

(3)在func子函数内部,a传进来的就是数据的指针(即首地址),函数形参传递数组的时候,其实本质就值传递了一个数组的首地址,而数组的大小就丢了

gcc编译结果如下

所以平时在函数调用数组时,采用如下的函数

#include <stdio.h>
#include <string.h> void func(int a[],int num)
{
//在子函数内,a传进来的就是数组的指针(首地址)
//在子函数内,num是数组的大小
}
int main()
{
int a[]; func(a,sizeof(a));
}

下面来说说#define和typedef

#include <stdio.h>

#define dpchar char*
typedef char* tpchar; int main()
{
dpchar p1,p2;
tpchar p3,p4; printf("sizeof(p1) = %3d\n",sizeof(p1));
printf("sizeof(p2) = %3d\n",sizeof(p2));
printf("sizeof(p3) = %3d\n",sizeof(p3));
printf("sizeof(p4) = %3d\n",sizeof(p4)); return ;
}

vc++6.0编译结果如下:

原因很简单,typedef就是给一个已有类型取一个别名,而#define就是字符串替换

dpchar p1,p2; 等价于 char* p1;char p2;
tpchar p3,p4; 等价于 char* p3;char* p4;

希望这篇对大家很有帮助!!!

指针、数组与sizeof运算符的更多相关文章

  1. C语言定义结构体指针数组并初始化;里面全是结构体的地址

    #include <stdio.h> #include <string.h> struct tells;//声明结构体 struct info { char *infos; } ...

  2. sizeof运算符和strlen函数的区别

    1.sizeof是运算符,而strlen是函数. 2.sizeof操作符的运算结果为size_t,他在头文件中的typedef为unsigned int.该类型保证能容纳所操作对象的最大字节大小. 3 ...

  3. 坑爹系列:sizeof运算符

    C语言里的sizeof关键字用于返回变量的类型宽度(变量所占的字节个数).例如: #include <stdio.h> int main() { int i = 0; int size = ...

  4. C 再识数组指针 指针数组的概念

    参考出处: http://www.cnblogs.com/mq0036/p/3382732.html http://www.cnblogs.com/hongcha717/archive/2010/10 ...

  5. sizeof运算符

    sizeof运算符返回一条表达式或一个类型名字所占的字节数.sizeof运算符满足右结合律,其所得的值是一个size_t类型的常量表达式.运算符的运算对象有两种形式: sizeof(type) siz ...

  6. C++ Prime:sizeof运算符

    sizeof运算符的结果部分地依赖于其作用的类型: 对char或者类型为char的表达式执行sizeof运算结果得1: 对引用类型执行sizeof运算得到被引用对象所占空间的大小: 对指针执行size ...

  7. C语言基础知识点整理(函数/变量/常量/指针/数组/结构体)

    函数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ...

  8. 【嵌入式开发】C语言 结构体相关 的 函数 指针 数组

    . 作者 : 万境绝尘 转载请注明出处 : http://www.hanshuliang.com/?post=30 . 结构体概述 : 结构体是 多个 变量的集合, 变量的类型可以不同; -- 可进行 ...

  9. 【嵌入式开发】C语言 内存分配 地址 指针 数组 参数 实例解析

    . Android源码看的鸭梨大啊, 补一下C语言基础 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/detai ...

随机推荐

  1. markdown基础使用

    标题 # 这是一级标题 ## 这是二级标题 ### 这是三级标题 #### 这是四级标题 ##### 这是五级标题 ###### 这是六级标题 实际效果       字体 **加粗字体** *斜体* ...

  2. 06 vue router(一)

    一.vue route是什么? Vue Router是vue.js官方的路由管理器.主要有以下几种功能 1.路由和视图表的配置.(已明白) 2.模块化和基于组件的路由配置.(已明白) 3.路由参数.查 ...

  3. PJzhang:ping命令的基本用法

    猫宁!!! 参考链接:https://www.cnblogs.com/diantong/p/9626751.html http://aiezu.com/article/linux_ping_comma ...

  4. 使用URLOS 五分钟安装rTorrent (轻量级优秀BT/PT客户端)

    rTorrent是一个非常简洁.优秀.非常轻量的BT客户端,它使用ncurses库以C++编写,将 rTorrent 用在安装有 GNU Screen 和 Secure Shell 的低端系统上作为远 ...

  5. TCP和SSL TCP应用

    TCP和SSL TCP应用 对于普通开发者而言编写TCP应用通讯是一件相对复杂的工作,毕竟需要一系列的bytes操作:如果再针对SSL的安全性处理相信会把很多普通开发者拒之门外.为了简化这一问题Bee ...

  6. [python] a little deep learning case

    from numpy import exp, array, random, dot class NeuralNetwork(): def __init__(self): random.seed(1) ...

  7. PTA(Advanced Level)1065.A+B and C

    Given three integers A, B and C in [−263,263], you are supposed to tell whether A+B>C. Input Spec ...

  8. PTA(Basic Level)1077.互评成绩计算

    在浙大的计算机专业课中,经常有互评分组报告这个环节.一个组上台介绍自己的工作,其他组在台下为其表现评分.最后这个组的互评成绩是这样计算的:所有其他组的评分中,去掉一个最高分和一个最低分,剩下的分数取平 ...

  9. [转帖]RPM的原理及rpm命令常用参数

    RPM的原理及rpm命令常用参数 2015年09月14日 15:39:43 lose_wait 阅读数 1298 https://blog.csdn.net/u012012939/article/de ...

  10. Hanlp配置自定义词典遇到的问题与解决方法

    本文是整理了部分网友在配置hanlp自定义词典时遇到的一小部分问题,同时针对这些问题,也提供另一些解决的方案以及思路.这里分享给大家学习参考. 要使用hanlp加载自定义词典可以通过修改配置文件han ...