C语言 数组名的意义 以及sizeof与strlen对数组类型的解析

`**

数组名的意义:

**
1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
3. 除此之外所有的数组名都表示首元素的地址

arr与&arr的了解与区分

arr是数组名,数组名表示数组首元素的地址。
&arr 表示的是数组的地址,而不是数组首元素的地址。(虽然值是一样的)

#include <stdio.h>
int main()
{
 int arr[10] = { 0 };
 printf("arr = %p\n", arr);//0133FBB0
 //数组首元素的地址
 printf("&arr= %p\n", &arr);//0133FBB0
 //&arr 表示的是数组的地址,。(虽然值是一样的,但是两者的含义不同)

 printf("arr+1 = %p\n", arr+1);//0133FBB4   加4
 //数组首元素的地址加1操作 跳一个元素的地址
 printf("&arr+1= %p\n", &arr+1);//0133FBD8  加40 
 //数组的地址+1,跳整个数组的大小,所以 &arr+1 相对于 &arr 的差值是40
 return 0;
}

sizeof与strlen对数组型的分析

strlen 是函数,sizeof 是运算操作符,二者得到的结果类型为 size_t,即 unsigned int 类型。大部分编译程序在编译的时候就把 sizeof 计算过了,而 strlen 的结果要在运行的时候才能计算出来。
sizeof 获得的是类型或变量所占的地址空间,32 位操作系统对应 4 字节; 。。。。 strlen 返回的是该字符串的长度,遇到 \0 结束, \0 本身不计算在内。
总结一句就是 sizeof 计算的是变量的字节大小,而 strlen 计算的是字符串的长度,前者不受字符 \0 影响,后者以 \0 作为长度判定依据。

地址的字节和指针一样大小是固定的4个字节

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include <stdlib.h>
int main()
{
    int a[] = { 1, 2, 3, 4 };
	printf("%d\n", sizeof(a));//16
	printf("%d\n", sizeof(a + 0));//4  数组首元素的地址 地址的字节大小为4
	printf("%d\n", sizeof(*a));//4  
	printf("%d\n", sizeof(a + 1));//4 第二个元素的地址
	printf("%d\n", sizeof(a[1]));//4  第二个元素的地址
	printf("%d\n", sizeof(&a));//4 数组的地址
	printf("%d\n", sizeof(*&a));//16  解引用整个数组
	printf("%d\n", sizeof(&a + 1)); //4 下一个数组的地址
	printf("%d\n", sizeof(&a[0]));//4 首元素的的地址
	printf("%d\n", sizeof(&a[0] + 1));//4 第二个元素的地址
	return 0;
}
//一维数组


//字符数组
int main()
{
	char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
	printf("%d\n", sizeof(arr));//6     整个数组的字节大小
	printf("%d\n", sizeof(arr + 0));//4  数组首元素的地址,
	printf("%d\n", sizeof(*arr));//1    解引用arr数组首元素的地址取得‘a’,为char类型占一个字节大小
	printf("%d\n", sizeof(arr[1]));//1   第二个元素 ‘b’
	printf("%d\n", sizeof(&arr));//4  数组的地址
	printf("%d\n", sizeof(&arr + 1));//4   下一个(层)数组的地址
	printf("%d\n", sizeof(&arr[0] + 1));//4  数组第二个元素的地址
	printf("%d\n", strlen(arr));// 随机数 n   //数组首元素的地址
	printf("%d\n", strlen(arr + 0));//首元素的地址        
	printf("%d\n", strlen(*arr));// 第一个元素            与strlen函数的参数不符
	printf("%d\n", strlen(arr[1]));//第二个元素
	printf("%d\n", strlen(&arr)); //整个数组的地址
	printf("%d\n", strlen(&arr + 1));//下一个数组的地址
	printf("%d\n", strlen(&arr[0] + 1));// n-1  //第二个元素的地址 
	return 0;
}

//字符串数组
int main(){
	char arr[] = "abcdef";
	printf("%d\n", sizeof(arr));//  7   整个数组的字节大小 6+1  字符串以/0结尾算一个字节
	printf("%d\n", sizeof(arr + 0));//4  首元素的地址
	printf("%d\n", sizeof(*arr));// 1 解引用首元素的地址
	printf("%d\n", sizeof(arr[1]));//1  第二个元素
	printf("%d\n", sizeof(&arr));//4  整个数组的地址
	printf("%d\n", sizeof(&arr + 1));//4  第二个数组的地址
	printf("%d\n", sizeof(&arr[0] + 1));//4 第二个元素的地址
	printf("%d\n", strlen(arr));// 6  strlen函数就是求字符串的长度的
	printf("%d\n", strlen(arr + 0));//6   首元素的地址
	printf("%d\n", strlen(*arr));// 第一个元素   与strlen函数的参数不符
	printf("%d\n", strlen(arr[1]));//第二个元素
	printf("%d\n", strlen(&arr)); //整个数组的地址
	printf("%d\n", strlen(&arr + 1));//下一个数组的地址
	printf("%d\n", strlen(&arr[0] + 1)); //第二个元素的地址 
	return 0;
}


int main(){
	char *p = "abcdef";
	printf("%d\n", sizeof(p));// 4   指针变量p存的地址 首元素的地址
	printf("%d\n", sizeof(p + 1));// 4  第二个元素的地址
	printf("%d\n", sizeof(*p));// 1    解引用为字符串abcdef的首元素a   类型为char 一个字节大小
	printf("%d\n", sizeof(p[0]));//1  p[0]等价于*(p+0) 还是首元素a
	printf("%d\n", sizeof(&p));// 4  p本来就是一个地址,再加一个取地址符号就相当于二级指针了,但是还是指向的地址
	printf("%d\n", sizeof(&p + 1));//4
	printf("%d\n", sizeof(&p[0] + 1));//4 
	printf("%d\n", strlen(p));//6 从第一个元素的地址开始,直到遇见\0停止
	printf("%d\n", strlen(p + 1));//5 从 第二个元素的地址开始,直到遇到\0停止
	printf("%d\n", strlen(*p));// 第一个字符,char类型与strlen函数参数不匹配
	printf("%d\n", strlen(p[0]));  //相当于*(p+0)第一个字符
	printf("%d\n", strlen(&p));//  二级指针
	printf("%d\n", strlen(&p + 1));
	printf("%d\n", strlen(&p[0] + 1));
	return 0;
}

int main()
{
	//二维数组        二维数组名代表数组指针,指向第一个一维数组的地址
	int a[3][4] = { 0 };
	printf("%d\n", sizeof(a));//48  4*3*4=48   int 四个字节  数组里12个元素
	printf("%d\n", sizeof(a[0][0]));//4 数组首元素整型0
	printf("%d\n", sizeof(a[0]));//16    4*4=16 整个第一个一维数组a[0]的字节大小   int 四个字节  数组里4个元素  []操作符自带解引用
	printf("%d\n", sizeof(a[0] + 1));//4  地址  *(a+0)+1     a[0]代表第一个一维数组,数组名进行加减操作时会变为地址加减,加减的步长这个数组名的类型
	printf("%d\n", sizeof(*(a[0] + 1)));// 4 地址
	printf("%d\n", sizeof(a + 1));//4 二维数组名代表数组指针,指向第一个一维数组的地址    a+1代表第二个一维数组的地址
	printf("%d\n", sizeof(*(a + 1)));//16  解引用第二个一维数组
	printf("%d\n", sizeof(&a[0] + 1));//4  地址
	printf("%d\n", sizeof(*(&a[0] + 1))); //16 解引用第二个一维数组
	printf("%d\n", sizeof(*a));//16
	printf("%d\n", sizeof(a[3]));//16  第四个一维数组的字节大小
	return 0;
}
发布了29 篇原创文章 · 获赞 8 · 访问量 2010

猜你喜欢

转载自blog.csdn.net/qq_44785014/article/details/102573605