C指针之指针、数组与sizeof运算符

指针、数组与sizeof运算符

  • sizeof是C语言的一个运算符
    • 主要sizeof不是函数,虽然用法很像函数,sizeof的作用是用来返回()里面的变量或者数据类型占用的内存字节数
  • sizeof存在的价值
    • 主要是因为在不同平台下各种数据类型所占的内存字节数不尽相同(譬如int在32位系统中为4字节,在16位系统中为2字节···)。
    • 所以程序中需要使用sizeof来判断当前变量/数据类型在当前环境下占几个字节。
  • char str[] = ”hello”;  sizeof(str)    sizeof(str[0])    strlen(str)    
char str[] = "hello";       //数组长度为6
printf("sizeof(str) = %d.\n", sizeof(str));				// 6
printf("sizeof(str[0]) = %d.\n", sizeof(str[0]));		// 1
printf("strlen(str) = %d.\n", strlen(str));				// 5
  • char *p=str;      sizeof(p)    sizeof(*p)    strlen(p)
    • 32位系统中所有指针的长度都是4,不管是什么类型的指针。
    • strlen是一个C库函数,用来返回一个字符串的长度(注意,字符串的长度是不计算字符串末尾的'\0'的)。一定要注意strlen接收的参数必须是一个字符串(字符串的特征是以'\0'结尾)    
char str[] = "hello";  
char *p = str; 
printf("sizeof(p) = %d.\n", sizeof(p));			// 4 相当于sizeof(char *)
printf("sizeof(*p) = %d.\n", sizeof(*p));		// 1 相当于sizeof(char)
printf("strlen(p) = %d.\n", strlen(p));			// 5 相当于strlen(str)
  • int n=10;                 sizeof(n)    
    • sizeof测试一个变量本身,和sizeof测试这个变量的类型,结果是一样的。
int n = 10;
printf("sizeof(n) = %d.\n", sizeof(n));			// 4
printf("sizeof(int) = %d.\n", sizeof(int));		// 4
  • int b[100];            sizeof(b)    
    • sizeof(数组名)的时候,数组名不做左值也不做右值纯粹就是数组名的含义
    • sizeof(数组名)实际返回的是整个数组所占用内存空间(以字节为单位的)。
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)

double b3[100];
printf("sizeof(b3) = %d.\n", sizeof(b3));		// 800 100×sizeof(double)
  • void    fun(  int   b[100]  ) {    sizeof(b)    }                    
    • 函数传参,形参是可以用数组的
    • 函数形参是数组时,实际传递是不是整个数组,而是数组的首元素首地址。也就是说函数传参用数组来传,实际相当于传递的是指针(指针指向数组的首元素首地址)。        
// func完全等同于func1
void func(int a[])
{
	printf("数组大小 = %d.\n", sizeof(a));
}

void func1(int *a)
{
	printf("数组大小 = %d.\n", sizeof(a));
}
int a[20];
func(a);			// 4 因为a在函数func内部就是指针,而不是数组
void func2(int *a, int num)
{
	// 在子函数内,a是传进来的数组的指针(首地址)
	// 在子函数内,num是数组的大小
}
func2(a, sizeof(a));
  • #define dpChar char *                  typedef char *tpChar;
dpChar p1,  p2;			// 展开:char *p1, p2; 相当于char *p1, char p2;
tpChar p3,  p4;			// 等价于:char *p3, char *p4;	

printf("sizeof(p1) = %d.\n", sizeof(p1));		// 4
printf("sizeof(p2) = %d.\n", sizeof(p2));		// 1
printf("sizeof(p3) = %d.\n", sizeof(p3));		// 4
printf("sizeof(p4) = %d.\n", sizeof(p4));		// 4

自动推导数组个数

int a[56];
int b = sizeof(a) / sizeof(a[0]);	// 整个数组字节数/数组中一个元素的字节数
printf("b = %d.\n", b);				// 结果应该是数组的元素个数

猜你喜欢

转载自blog.csdn.net/baidu_41388533/article/details/106744846