指针数组与sizeof运算符
Posted jiangtongxue
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指针数组与sizeof运算符相关的知识,希望对你有一定的参考价值。
1、sizeof是C语言的一个运算符(主要sizeof不是函数,虽然用法很像函数),sizeof的作用是用来返回()里边
的变量或者数据类型占用的内存字节数。
2、sizeof存在的价值:
主要是因为在不同平台下各种数据类型所占的内存字节数不尽相同(譬如int在32位系统上为4字节,在16位系统上
为2字节)。所以程序中需要使用sizeof来判断当前变量/数据类型在当前环境下占几个字节。
3、举例说明:
例子1:char str[] = "hello";
sizeof(str) //元素所占的字节数,也就是数组的大小 占6个字节
sizeof(str[0]) //第0个元素,第0个元素是char型的,所以 占1个字节
sizeof(str) //字符串的长度(不包含最后的\0), 占5个字节
例子2:char str[] = "hello"; char *p = str;//str做右值,相当于首元素的首地址,数组的元素是char型,
//那么str就是char *,刚好匹配
sizeof(p) //p本身是一个指针变量,跟p指向的变量一点关系没有;只是一个char *指针的长度,
//32位系统上所有的指针的长度都是4
sizeof(*p) //p所指向的变量,p所指向的变量是char型的,相当于sizeof(char) 自然是1
strlen(p) //相当于strlen(str) 5
例子3:
int b1[100] = 0;
printf("sizeof(b1) = %d.\n",sizeof(b1)); //400 100*sizeof(int)
的变量或者数据类型占用的内存字节数。
2、sizeof存在的价值:
主要是因为在不同平台下各种数据类型所占的内存字节数不尽相同(譬如int在32位系统上为4字节,在16位系统上
为2字节)。所以程序中需要使用sizeof来判断当前变量/数据类型在当前环境下占几个字节。
3、举例说明:
例子1:char str[] = "hello";
sizeof(str) //元素所占的字节数,也就是数组的大小 占6个字节
sizeof(str[0]) //第0个元素,第0个元素是char型的,所以 占1个字节
sizeof(str) //字符串的长度(不包含最后的\0), 占5个字节
例子2:char str[] = "hello"; char *p = str;//str做右值,相当于首元素的首地址,数组的元素是char型,
//那么str就是char *,刚好匹配
sizeof(p) //p本身是一个指针变量,跟p指向的变量一点关系没有;只是一个char *指针的长度,
//32位系统上所有的指针的长度都是4
sizeof(*p) //p所指向的变量,p所指向的变量是char型的,相当于sizeof(char) 自然是1
strlen(p) //相当于strlen(str) 5
例子3:
int b1[100] = 0;
printf("sizeof(b1) = %d.\n",sizeof(b1)); //400 100*sizeof(int)
short b2[100] = ;
printf("sizeof(b2) = %d.\n",sizeof(b2)); //200 100*sizeof(short)
printf("sizeof(b2) = %d.\n",sizeof(b2)); //200 100*sizeof(short)
double b3[100];
printf("sizeof(b3) = %d.\n",sizeof(b3)); //800 100*sizeof(double)
4、
#define dpChar char *
typedef char * tpChar;
dpChar p1, p2;//展开:char *p1,p2; 相当于char *p1,char p2; 所以sizeof(p1)为4,sizeof(p2)为1
tpChar p3, p4;//相当于char *p3,char *p4; 所以sizeof(p3)为4,sizeof(p4)为4
5、
(1)函数传参,形参是可以传数组的
(2)函数形参是数组时,实际传递的不是整个数组,而是数组的首元素首地址。也就是说函数传参用数组来传,
实际相当于传递的时指针(指针指向数组的首元素首地址),所以下边的结果是4,而不是80
void func(int a[])//func完全等同于func1
printf("数组大小 = %d.\n",sizeof(a));
void func1(int *a)
printf("数组大小 = %d.\n",sizeof(a));
int main(void)
int a[20];
func(a); //打印出来的结果是4,因为a在函数内部是指针,而不是数组
printf("sizeof(b3) = %d.\n",sizeof(b3)); //800 100*sizeof(double)
4、
#define dpChar char *
typedef char * tpChar;
dpChar p1, p2;//展开:char *p1,p2; 相当于char *p1,char p2; 所以sizeof(p1)为4,sizeof(p2)为1
tpChar p3, p4;//相当于char *p3,char *p4; 所以sizeof(p3)为4,sizeof(p4)为4
5、
(1)函数传参,形参是可以传数组的
(2)函数形参是数组时,实际传递的不是整个数组,而是数组的首元素首地址。也就是说函数传参用数组来传,
实际相当于传递的时指针(指针指向数组的首元素首地址),所以下边的结果是4,而不是80
void func(int a[])//func完全等同于func1
printf("数组大小 = %d.\n",sizeof(a));
void func1(int *a)
printf("数组大小 = %d.\n",sizeof(a));
int main(void)
int a[20];
func(a); //打印出来的结果是4,因为a在函数内部是指针,而不是数组
以上是关于指针数组与sizeof运算符的主要内容,如果未能解决你的问题,请参考以下文章