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进行指针定义。