指针和数组练习题

目录

一、一维数组

二、字符数组

三、小结


一、一维数组

#include <stdio.h>
int main()
{
	//1.sizeof(数组名)代表的是整个数组的地址
	//2.&数组名代表的是整个数组的地址
   // 除了以上两种情况之外,数组名都代表首元素地址
	int a[] = { 1,2,3,4 };
	printf("%d\n", sizeof(a));//16;a为数组名,sizeof(a)代表整个数组的地址,所以这里就是整个数组大小
	printf("%d\n", sizeof(a + 0));//4;(a+0)表示的是首元素地址加0,所以还是首元素地址,我们知道地址大小就是4字节或者8字节,看我们是32位还是64位操作系统
	printf("%d\n", sizeof(*a));//4;对a进行解引用,指向的是数组首元素地址
	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;对a整个数组的地址进行解引用,找到的就是a这个数组
	printf("%d\n", sizeof(&a + 1));//4;跳过整个数组后面的那个元素
	printf("%d\n", sizeof(&a[0]));//4;第一个元素的地址
	printf("%d\n", sizeof(&a[0] + 1));//4,首元素地址加一,就是第二个元素的地址
	return 0;
}

二、字符数组

char arr[] = { 'a','b','c','d','e','f' };

#include <stdio.h>
#include <string.h>
int main()
{
	//sizeof求字符串大小,当遇上结束标志‘\0'时,会把它也算成一个字节
	//strlen遇上‘\0’结束标志才会停止计算它的大小
	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;对首元素地址进行解引用操作,指向的是首元素‘a',它的大小就是一个字节
	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;第二个元素‘b’的地址大小
	printf("%d\n", strlen(arr));//随机值,因为没有结束标志‘\0',所以不知道它找到什么时候才能找到‘\0'
	printf("%d\n", strlen(arr + 0));//随机值,理由同上
	printf("%d\n", strlen(*arr));//error,这里找到的是首元素‘a'的ASCII码值97,从97开始去找‘\0',所以它会报错
	printf("%d\n", strlen(arr[1]));//error,这里找到的是‘b'的ASCII码值98,从98开始去找‘\0',所以它会报错
	printf("%d\n", strlen(&arr));//随机值
	printf("%d\n", strlen(&arr + 1));//随机值
	printf("%d\n", strlen(&arr[0] + 1));//随机值
	//以上三个都是随机值,理由都一样(‘\0'),只是开始找的位置不一样
	return 0;
}

 char arr[] = "abcdef";

int main()
{
	//sizeof求字符串大小,当遇上结束标志‘\0'时,会把它也算成一个字节
//	//strlen遇上‘\0’结束标志才会停止计算它的大小
	char arr[] = "abcdef";
	printf("%d\n", sizeof(arr));//7;遇上结束标志‘\0'时,会把它也算成一个字节
	printf("%d\n", sizeof(arr + 0));//4;首元素地址大小
	printf("%d\n", sizeof(*arr));//1;对首元素进行解引用操作,得到的是首元素a
	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;遇上结束标志‘\0'停止计算
	printf("%d\n", strlen(arr + 0));//6;从首元素开始到结束标志
	printf("%d\n", strlen(*arr));//error;这里找到的是首元素a的ASCII码值97,从97开始去找‘\0',所以它会报错
	printf("%d\n", strlen(arr[1]));//error;这里找到的是b的ASCII码值98,从98开始去找‘\0',所以它会报错
	printf("%d\n", strlen(&arr));//6;整个数组大小
	printf("%d\n", strlen(&arr + 1));//随机值;从跳过了整个数组后面那个元素开始数,我们不知道它的结束标志在哪,所以这里是随机值
	printf("%d\n", strlen(&arr[0] + 1));//5;从第二个元素开始数一直到结束标志
	return 0;
}

 char *p = "abcdef";

#include <stdio.h>
#include <string.h>
int main()
{
	char* p = "abcdef";
	printf("%d\n", sizeof(p));//4;这里p代表的是指针变量,所以它的大小是4个字节
	printf("%d\n", sizeof(p + 1));//4;这里算的是b的地址大小
	printf("%d\n", sizeof(*p));//1;p为首元素地址,它进行解引用操作,得到的是首元素a
	printf("%d\n", sizeof(p[0]));//1;首元素a的大小,这里等价于*(p+0)
	printf("%d\n", sizeof(&p));//4;这里得到的就是指针变量p的地址
	printf("%d\n", sizeof(&p + 1));//4;这里得到的是p后面那个空间的地址大小
	printf("%d\n", sizeof(&p[0] + 1));//4;b的地址大小
	printf("%d\n", strlen(p));//6;
	printf("%d\n", strlen(p + 1));//5,从第二个元素b开始数
	printf("%d\n", strlen(*p));//error;这里找到的是首元素a的ASCII码值97,从97开始去找‘\0',所以它会报错
	printf("%d\n", strlen(p[0]));//error;这里找到的是b的ASCII码值98,从98开始去找‘\0',所以它会报错
	printf("%d\n", strlen(&p));//随机值,这里得到的是指针变量p的地址,从地址里面去找‘\0',所以这是个随机值
	printf("%d\n", strlen(&p + 1));//随机值,理由同上,只是起始位置不同
	printf("%d\n", strlen(&p[0] + 1));//5,从第二个元素开始找
	return 0;
}

 三、小结

   以上就是数组和指针的在sizeof和strlen下计算的不同,以及数组和指针的不同表达形式带来不同的大小计算。

猜你喜欢

转载自blog.csdn.net/m0_65673419/article/details/124010094