个人理解—sizeof()解析

       sizeof(),别看带个括号,但实际上并不是函数,而是运算符。其功能是用于计算变量/数据所占内存空间大小。

        sizeof()中的元素不做左值也不做右值。

       在数据str[]数组中,明面上是五个英文字母,但实际上在结尾处还有一个“\0”做结尾标志。

char str[]="hello";

        所以

sizeof(str);  输出6 大小是5个字母+\0
sizeof(str[0]);输出1
strlen(str);输出5  长度只看数据部分

        如果希望使用一个char类型指针实现对str[]的间接访问会有什么不同呢?

char *p=str;str是首元素地址

sizeof(p);输出4  指针大小为4字节
sizeof(*p);输出1 数组中首元素“h”的大小为1字节
strlen(p);结果相当于strlen(str) 5

        sizeof(数组名) 返回整个数组所占内存大小。

int b[100]={10};
sizeof(b)=100*sizeof(int)=400

        如果数据传输时,数组为形参进行传输,其效果等同于上面的使用char类型指针对str[]进行间接访问。

void fun(int b[])  传入a[20]
{
    sizeof(b);
}
输出4

        其原因也与上面相同,在函数形参为数组时,实际上只是传输过去了数组的首元素的首地址,所以在计算时大小为4(地址大小)。

        所以,要将数组的大小也一并传入,这样就能够通过移动指针的方式通过累加进行数组大小的计算如:

void func(int *a,int num) int *a与int b[]等效

        int *a 为指向数组的指针 num为数组大小(str(num)的num)。

        计算数组中的元素个数方式:

num=sizeof(a)/sizeof(a[0])

int a1[]={1,2,3,4,5};
char str[]="hello";
printf("%d\n",sizeof(a1)/sizeof(a1[0])); 输出5
printf("%d\n",sizeof(str)/sizeof(str[0]));输出6 原因是字符串结尾有\0

        这里插一个指针连续定义的要点。在实际使用指针的过程中,有时候需要连续定义同一类型的多个指针,这时候就会出现以下的情况。

char* p1,p2;

        初学者会认为,通过这样的方式就能定义两个char类型的指针,但实际上只是第一个p1为cahr类型的指针,第二个为char类型的变量。原因很简单“*”只会修饰其最近的一个变量。

        如果我们要进行连续定义应该怎么办呢?我们都知道#define是用于宏定义的,那么可以通过宏定义来实现吗?例如:

#define dpchar char*
dpcahr p1,p2;

        答案是,不太行,因为宏定义的就是原位置替换,被替换后依旧是char* p1,p2;的样式,本质上还是只有一个指针变量被定义。

        所以define的路是走不通的,这时候就要使用重命名或自定义类型来实现。

typedef char* tpchar;
tpchar p3,p4;
相当于
char *p1,*p2;

        这样就能完成相同类型指针的连续定义,当然也可以使用char* p1,*p2进行指针定义。

        

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值