当前位置:网站首页>指针,它那些不得不说的题目
指针,它那些不得不说的题目
2022-06-25 12:35:00 【LIn_jt】
本文将以练习题的方式着重对指针进行理解与对做题时出现的错误进行解析
做这些问题之前,需要知道的是,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)]](/img/5a/2cf57f9fb73922df7157479c2e3ab3.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;
}


边栏推荐
- Sword finger offer day 2 linked list (simple)
- torch. Tensor splicing and list (tensors)
- LeetCode链表题解技巧归纳总结
- MySQL learning notes
- 买基金在哪里开户安全?还请赐教
- [machine learning] model and cost function
- An article clearly explains MySQL's clustering / Federation / coverage index, back to table, and index push down
- JS SMS countdown implementation (simple code)
- [AI helps scientific research] fool drawing of loss curve
- Sword finger offer II 028 Flatten multi-level bidirectional linked list
猜你喜欢

二叉树之_哈夫曼树_哈弗曼编码

3+1 guarantee: how is the stability of the highly available system refined?

Seven competencies required by architects

MySQL adds, modifies, and deletes table fields, field data types, and lengths (with various actual case statements)

Django框架——缓存、信号、跨站请求伪造、 跨域问题、cookie-session-token

Sword finger offer day 2 linked list (simple)

剑指Offer 第 2 天链表(简单)
![[AI helps scientific research] fool drawing of loss curve](/img/38/5cb2a3d33a609dab3874215d5f7b5b.png)
[AI helps scientific research] fool drawing of loss curve

《MongoDB入门教程》第01篇 MongoDB简介

药物设计新福音:腾讯联合中科大、浙大开发自适应图学习方法,预测分子相互作用及分子性质
随机推荐
与生产环境中的 console.log 说再见
Used in time filter (EL table)
AI assisted paper drawing of PPT drawing
20220620 interview reply
美创入选“2022 CCIA中国网络安全竞争力50强”榜单
剑指 Offer II 029. 排序的循环链表
【AI助力科研】loss曲线傻瓜式绘制
剑指offer 第 3 天字符串(简单)
剑指 Offer II 028. 展平多级双向链表
[转]以终为始,详细分析高考志愿该怎么填
坡道带来的困惑
中国虚拟人哪家强?沙利文、IDC:小冰百度商汤位列第一梯队
Capabilities required by architects
JS picture switching (simple and practical)
torch. Tensor splicing and list (tensors)
Serenvlt first met
剑指 Offer II 025. 链表中的两数相加
Summary of leetcode linked list problem solving skills
Optimization of lazyagg query rewriting in parsing data warehouse
Sword finger offer day 3 string (simple)