指针和数组笔试题解析:sizeof()和strlen()求数组/字符串的size和lenth

核心

  • sizeof(数组名) 数组名代表整个数组
  • &数组名 取得是整个数组的地址
  • 数组名 + 0 : 数组首元素地址
  • 数组名 : 数组首元素地址
  • 数组名[0] : 数组首元素

具体代码

int main () {
	int a[] = { 1, 2, 3, 4 };
	printf("%d\n", sizeof(a));//a 代表整个数组
	printf("%d\n", sizeof(a + 0));//数组首元素地址
	printf("%d\n", sizeof(*a));//数组首元素
	printf("%d\n", sizeof(a + 1));//数组第二个元素的地址
	printf("%d\n", sizeof(a[1]));//第二个元素
	printf("%d\n", sizeof(&a));//整个数组的地址
	printf("%d\n", sizeof(*&a));//整个数组
	printf("%d\n", sizeof(&a + 1));//取地址a,代表整个数组的地址,加 1,跳过整个数组,结果是指针
	printf("%d\n", sizeof(&a[0]));//取首元素的地址
	printf("%d\n", sizeof(&a[0] + 1));//取首元素的地址加 1

	//字符数组
	char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' }; 
	printf("%d\n", sizeof(arr)); //arr代表整个数组
	printf("%d\n", sizeof(arr + 0));//数组首元素的地址
	printf("%d\n", sizeof(*arr));//arr代表首元素地址,解引用为数组首元素
	printf("%d\n", sizeof(arr[1])); //数组第二个元素
	printf("%d\n", sizeof(&arr)); //整个数组的地址
	printf("%d\n", sizeof(&arr + 1));//整个数组的地址 加 1,跳过整个数组,结果还是指针
	printf("%d\n", sizeof(&arr[0] + 1));//取数组首元素的地址 加 1,结果是地址

	//求strlen 需要以 '\0' 结尾,参数是地址
	//printf("%d\n", strlen(arr)); //以'\0'结尾,计算字符串的长度
	//printf("%d\n", strlen(arr + 0));//数组首元素地址
	//printf("%d\n", strlen(*arr));//数组首元素
	//printf("%d\n", strlen(arr[1])); //数组第二个元素
	//printf("%d\n", strlen(&arr));//整个数组的地址
	//printf("%d\n", strlen(&arr + 1));//整个数组的地址加 1 跳过这个数组
	//printf("%d\n", strlen(&arr[0] + 1));//取数组首元素的地址加 1,结果是地址

	//字符串
	char arr[] = "abcdef";//字符串赋值给数组,会在末尾加 '\0'
	printf("%d\n", sizeof(arr));//arr 代表整个数组
	printf("%d\n", sizeof(arr + 0));//数组首元素地址
	printf("%d\n", sizeof(*arr));//数组首元素
	printf("%d\n", sizeof(arr[1]));//数组第二个元素
	printf("%d\n", sizeof(&arr));//整个数组的地址
	printf("%d\n", sizeof(&arr + 1));//整个数组的地址加 1,跳过整个数组,结果是地址
	printf("%d\n", sizeof(&arr[0] + 1));//取数组首元素的地址加 1,结果是地址

	printf("%d\n", strlen(arr));//arr代表数组首元素地址
	printf("%d\n", strlen(arr + 0));//数组首元素地址
	//printf("%d\n", strlen(*arr));//数组首元素,不是地址
	//printf("%d\n", strlen(arr[1]));//数组第二元素,不是地址
	//printf("%d\n", strlen(&arr));//整个数组的地址,类型是char*[7],而参数需要是char*
	//printf("%d\n", strlen(&arr + 1));//整个数组的地址加 1,跳过整个数组,结果是地址
	printf("%d\n", strlen(&arr[0] + 1));//取数组首元素的地址加 1,结果是地址,指向数组第二个元素

	
	char *p = "abcdef";
	printf("%d\n", sizeof(p));//p是指针,不是数组名
	printf("%d\n", sizeof(p + 1)); //还是指针
	printf("%d\n", sizeof(*p)); //首元素
	printf("%d\n", sizeof(p[0])); //首元素
	printf("%d\n", sizeof(&p)); //p的地址
	printf("%d\n", sizeof(&p + 1));//取p的地址加 1,还是地址
	printf("%d\n", sizeof(&p[0] + 1));//取首元素的地址加 1

	printf("%d\n", strlen(p));//指向第一个元素的指针
	printf("%d\n", strlen(p + 1));//指向第二元素的指针
	//printf("%d\n", strlen(*p));//首元素
	//printf("%d\n", strlen(p[0]));//首元素
	//printf("%d\n", strlen(&p)); //取p的地址
	//printf("%d\n", strlen(&p + 1));//取p的地址,加 1
	printf("%d\n", strlen(&p[0] + 1));//取首元素的地址加 1,结果是地址

	//
	//二维数组
	int a[3][4] = {0};
	printf("%d\n",sizeof(a));//a 代表整个数组
	printf("%d\n",sizeof(a[0][0]));//第一行第一个元素
	printf("%d\n",sizeof(a[0]));//第一行 相当于 *(a + 0)
	printf("%d\n",sizeof(a[0]+1));//a[0] 相当于一维数组的数组名,加 1,结果为地址,指向这一行的第二个元素
	printf("%d\n",sizeof(*(a[0]+1)));//第一行的第二个元素
	printf("%d\n",sizeof(a+1));//第二行的地址
	printf("%d\n",sizeof(*(a+1)));//第二行的所有元素
	printf("%d\n",sizeof(&a[0]+1));//取第一行的地址加 1,为第二行的地址
	printf("%d\n",sizeof(*(&a[0]+1))); //第二行的所有元素
	printf("%d\n",sizeof(*a));//a 为二维数组的第一行的地址,解引用之后为第一行的所有元素
	printf("%d\n",sizeof(a[3]));//第四行
	return 0;
}
发布了60 篇原创文章 · 获赞 5 · 访问量 2653

猜你喜欢

转载自blog.csdn.net/qq_44905386/article/details/99690609