指针,它那些不得不说的题目

本文将以练习题的方式着重对指针进行理解与对做题时出现的错误进行解析

做这些问题之前,需要知道的是,sizeof内部单独放一个数组名, 代表整个数组, &数组名, 此时也是取出整个数组的地址。

首先请看以下例题:>

int main()
{
	int a[] = { 1,2,3,4 }; 
	printf("%d\n", sizeof(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));
	printf("%d\n", sizeof(&a[0])); 
	printf("%d\n", sizeof(&a[0] + 1));
	return 0;
}

(下面是解析,做完题再看!!!)

int a[] = { 1,2,3,4 }; 
printf("%d\n", sizeof(a));

此处sizeof(a)中单独放置了一个数组名,在这种情况下,数组名代表整个数组,计算的是整个数组所占内存的空间大小,如下图所示

因此,本题的答案为4 * 4, 即为16byte.

int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a + 0)); 

此处sizeof(a+0),这一个+0,又把a变得不孤单了,此处sizeof(a + 0),数组名a并没有单独放在sizeof内部,因此表示的是数组首元素的地址,即

因此,你a+0后仍然是一个指向1的地址,因此,结果为地址的大小,即4/8byte!

int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(*a)); 

这里中sizeof仍然没有单独放置数组名,因此,数组名a仍然表示数组首元素的地址,对该地址解引用,找到的是我们的数字1,即

在这里插入图片描述

因此,即求得是整型的大小,因此,本题答案为4byte,即int类型所占空间的大小。

int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a + 1)); 

本题与sizeof(a + 0)那道题很类似,a+1其实也就是将首元素的地址加上1,跳过一个整型,来到数组的第二个元素,即

在这里插入图片描述

因此,结果也就为地址的大小,是4/8byte

int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a[1]));

sizeof(a[1]),就是在访问下标为1的元素嘛,在这里下标为1的元素是整型数字2,因此,求得也就是int类型所占内存空间大小,结果为4

int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(&a)); 

还记得开头那句话吗?(忘记的回去重看!😂),&a此处的a代表的是整个数组,即取出整个数组的地址。即

说了这么多,但它本质上还是一个指针啊!,指针的大小即地址的大小,因此结果为4/8byte

int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(*&a));

第二组例题:>

char arr[] = {'a','b','c','d','e','f'}; 
printf("%d\n", sizeof(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)); 
printf("%d\n", sizeof(&arr[0]+1));

(依然是一点点分割线)

在这里插入图片描述

解析:>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gk0eybJs-1642928813725)(C:\Users\MSI-NB\AppData\Roaming\Typora\typora-user-images\image-20211211174116103.png)]

第三组例题:>

char arr[] = {'a','b','c','d','e','f'}; 
printf("%d\n", strlen(arr)); 
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)); 
printf("%d\n", strlen(&arr[0]+1))

这题要注意arr中有无’\0’字符.

(分割线)

解析:>

第四组例题:>

char arr[] = "abcdef"; 
printf("%d\n", sizeof(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)); 
printf("%d\n", sizeof(&arr[0]+1));

(分割线-----------------------)

在这里插入图片描述

此处的字符数组arr的字符串的形式来初始化,因此在字符串的结尾会默认放一个’\0’,因此,各题的解析为:>

1.sizeof(arr)

在这里插入图片描述

2.sizeof(arr+0)

3.sizeof(*arr)

在这里插入图片描述

4.sizeof(arr[1])

在这里插入图片描述

5.sizeof(&arr)

在这里插入图片描述

6.sizeof(&arr + 1)

在这里插入图片描述

7.sizeof(&arr[0] + 1)

在这里插入图片描述

分析出来的结果为这样子:>
在这里插入图片描述

程序运行的结果为:>
在这里插入图片描述

第五组例题:>

char arr[] = "abcdef"; 
printf("%d\n", strlen(arr)); 
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));
printf("%d\n", strlen(&arr[0]+1));

(分割线----------------)

在这里插入图片描述

1.char arr[] = "abcdef"; 
  strlen(arr)

在这里插入图片描述

2.char arr[] = "abcdef";
strlen(arr + 0);

在这里插入图片描述

3.char arr[] = "abcdef";
    printf("%d\n", strlen(*arr));

在这里插入图片描述

4.char arr[] = "abcdef";
printf("%d\n", strlen(arr[1])); 

在这里插入图片描述

5.char arr[] = "abcdef"; 
printf("%d\n", strlen(&arr));

在这里插入图片描述

6.char arr[] = "abcdef"; 
printf("%d\n", strlen(&arr+1));

在这里插入图片描述

7.char arr[] = "abcdef";
printf("%d\n", strlen(&arr[0]+1));

即结果为:>

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

第六组例题:>

char* p = "abcdef"; 
printf("%d\n", sizeof(p)); 
printf("%d\n", sizeof(p + 1)); 
printf("%d\n", sizeof(*p)); 
printf("%d\n", sizeof(p[0])); 
printf("%d\n", sizeof(&p)); 
printf("%d\n", sizeof(&p + 1)); 
printf("%d\n", sizeof(&p[0] + 1));
return 0;

(分割线:>)

在这里插入图片描述

在这里插入图片描述

1.char* p = "abcdef"; 
printf("%d\n", sizeof(p)); 

在这里插入图片描述

2.char* p ="abcdef";
printf("%d\n", sizeof(p + 1));

在这里插入图片描述

3.char* p ="abcdef";
printf("%d\n", sizeof(*p));

在这里插入图片描述

4.char* p ="abcdef";
printf("%d\n", sizeof(p[0])); 

在这里插入图片描述

5,6
char* p = "abcdef"; 
printf("%d\n", sizeof(&p)); 
printf("%d\n", sizeof(&p + 1)); 

在这里插入图片描述
在这里插入图片描述

7.char* p = "abcdef";
printf("%d\n", sizeof(&p[0] + 1));

在这里插入图片描述

因此,我们解析得到的结果是:>
在这里插入图片描述

程序运行得到的结果为:>

在这里插入图片描述

第七组例题:>

char* p = "abcdef";
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)); 
printf("%d\n", strlen(&p+1)); 
printf("%d\n", strlen(&p[0]+1));

(分割线--------------------)

1.char* p = "abcdef";
printf("%d\n", strlen(p)); 

2.char* p = "abcdef";
printf("%d\n", strlen(p+1));

在这里插入图片描述

3.char* p = "abcdef";
printf("%d\n", strlen(*p)); 

在这里插入图片描述

4.char* p = "abcdef";
printf("%d\n", strlen(p[0])); 

在这里插入图片描述

5.char* p = "abcdef";
printf("%d\n", strlen(&p)); 

在这里插入图片描述

6.char* p = "abcdef";
printf("%d\n", strlen(&p+1)); 

在这里插入图片描述

7.char* p = "abcdef";
printf("%d\n", strlen(&p[0]+1));

在这里插入图片描述

分析出来的结果为:>
在这里插入图片描述

程序运行的结果为:>

在这里插入图片描述

在这里插入图片描述

接下来请接受一波二维数组的拷打:>

在这里插入图片描述

int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; 
printf("%d\n",sizeof(a)); 
printf("%d\n",sizeof(a[0][0])); 
printf("%d\n",sizeof(a[0])); 
printf("%d\n",sizeof(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)); 
printf("%d\n",sizeof(*(&a[0]+1))); 
printf("%d\n",sizeof(*a)); 
printf("%d\n",sizeof(a[3]));

(分割线:>)

1.int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; 
printf("%d\n",sizeof(a)); 

在这里插入图片描述

因此,第一题:>

在这里插入图片描述

2.int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; 
printf("%d\n",sizeof(a[0][0])); 

在这里插入图片描述

3.int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
printf("%d\n",sizeof(a[0])); 

(看一下第一题的那张图噢!)

在这里插入图片描述

(在这里的整个数组指的是第一行)

4.int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
printf("%d\n",sizeof(a[0]+1)); 

在这里插入图片描述

5.int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
printf("%d\n",sizeof(*(a[0]+1)));

在这里插入图片描述

6.int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
printf("%d\n",sizeof(a+1));

在这里插入图片描述

7.int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
printf("%d\n",sizeof(*(a+1)));

8.int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
printf("%d\n",sizeof(&a[0]+1)); 

在这里插入图片描述

9.int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
printf("%d\n",sizeof(*(&a[0]+1))); 

在这里插入图片描述

10.int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
printf("%d\n",sizeof(*a)); 

在这里插入图片描述

11.int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
printf("%d\n",sizeof(a[3]));

在这里插入图片描述

一些其他的题~~~~

int main()
{
	int a[5] = { 1, 2, 3, 4, 5 };
	int *ptr = (int *)(&a + 1);
	printf( "%d,%d", *(a + 1), *(ptr - 1));
	return 0;
}

在这里插入图片描述

在这里插入图片描述

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值