当前位置:网站首页>【C语言】指针与数组笔试题详解
【C语言】指针与数组笔试题详解
2022-07-03 00:56:00 【平凡的人1】
作者:@平凡的人1
专栏:《C语言从0到1》
一句话:凡是过往,皆为序章
说明: 过去无可挽回, 未来可以改变
前言
前面我们学习过了指针全部的相关知识点,从指针的概念开始,学习指针类型的意义,进行指针的运算,随后还有指针数组,以及数组名的意义,还有数组指针,函数指针,函数指针数组等。对于指针的知识我们总体上已经学习完了。这一篇博客我们将进行指针和数组题目的练习,全程内容满满,不要走神!
一维数组
#include <stdio.h>
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;
}
下面进行解析:
开始之前,我们要知道sizeof()计算的空间所占字节大小,数组名是首元素地址(两个例外:1.&数组名表示整个数组的地址,sizeof(数组名)表示整个数组)
#include <stdio.h>
int main()
{
//一维数组
int a[] = {
1,2,3,4 };
printf("%d\n", sizeof(a));//16
//sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小,单位是字节
printf("%d\n", sizeof(a + 0));//4/8
//32位平台为4,64位平台为8
//a+0不是单独的数组名a,所以此时a表示数组首元素地址,首元素地址+0还是首元素地址
//地址值为4/8,当前平台为x86平台,答案为4
printf("%d\n", sizeof(*a));//4
//*a中的a为数组首元素地址,*a就是对首元素地址进行解引用
//首元素的大小为4个字节
printf("%d\n", sizeof(a + 1));//4/8
//这里的a是数组首元素地址,a+1是第二个元素的地址
//地址的大小为4/8
printf("%d\n", sizeof(a[1]));//4
//第二个元素的大小为4个字节
printf("%d\n", sizeof(&a));//4/8
//&a取出的数组的地址,数组的地址,也就是个地址
//地址的大小为4/8
printf("%d\n", sizeof(*&a));//16
//&a得到的是整个数组的地址,即为---int(*)[4],对其解引用访问的是数组
//所以大小为16
//可以简单理解为*和&相互抵消
printf("%d\n", sizeof(&a + 1));//4/8
//&a得到的是数组的地址
//&a+1从数组a的地址向后跳过了(4个整型元素的)数组的大小
//&a+1还是地址,地址大小为4/8
printf("%d\n", sizeof(&a[0]));//4/8
//第一个元素的地址的大小
//地址的大小为4/8
printf("%d\n", sizeof(&a[0] + 1));//4/8
//&a[0]+1是第二个元素的地址
//地址大小为4/8个字节
return 0;
}
字符数组
1
#include <stdio.h>
#include <string.h>
int main()
{
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));
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));
return 0;
}
代码解析:
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = {
'a','b','c','d','e','f' };
printf("%d\n", sizeof(arr));//6
//sizeof(数组名),数组的大小,为6
printf("%d\n", sizeof(arr + 0));//4/8
//arr+0是数组首元素的地址
printf("%d\n", sizeof(*arr));//1
//首元素地址解引用,*arr就是数组的首元素,大小是1字节
printf("%d\n", sizeof(arr[1]));//1
//第二个元素大小为1个字节
printf("%d\n", sizeof(&arr));//4/8
//&arr是数组的地址,是地址就是4/8个字节
printf("%d\n", sizeof(&arr + 1));//4/8
//&arr+1是数组后的地址
//地址就是4/8
printf("%d\n", sizeof(&arr[0] + 1));//4/8
//&arr[0]+1是第二个元素的地址
//地址大小就是4/8
/**************************************************************/
printf("%d\n", strlen(arr));//随机值>=6
//'\0'位置不确定,所以输出的值为随机值
printf("%d\n", strlen(arr + 0));//随机值
//arr是首元素地址,arr+0还是不变,仍然是随机值
printf("%d\n", strlen(*arr));//errorr错误
//strlen()传入的是地址,传入*arr时,*arr就是第一个元素,传入了’a'
//97不是地址,所以会报错,类似野指针问题
printf("%d\n", strlen(arr[1]));//error
//传入‘b’即98还是一样的结果,有问题
printf("%d\n", strlen(&arr));//随机值
//&arr得到数组的地址,'\0’不确定在哪里,仍然为随机值
printf("%d\n", strlen(&arr + 1));//随机值
//&arr+1跳过这个数组,后面'\0‘的位置仍然不确定
//可以理解为上面的随机值-6
printf("%d\n", strlen(&arr[0] + 1));//随机值
//&arr[0]+1表示第二个元素的地址,后面'\0'位置仍然不确定
return 0;
}
2
#include <stdio.h>
#include <string.h>
int main()
{
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));
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));
return 0;
}
代码解析:strlen()求字符串长度,注意’\0’之前的出现的字符个数
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = "abcdef";
//a b c d e f \0
printf("%d\n", sizeof(arr));//7
//数组7个字节
printf("%d\n", sizeof(arr + 0));//4/8
//此时arr表示数组首元素地址,arr+0不变
//地址大小为4/8
printf("%d\n", sizeof(*arr));//1
//首元素地址解引用为第一个元素,大小为1个字节
printf("%d\n", sizeof(arr[1]));//1
//第二个元素字节大小为1
printf("%d\n", sizeof(&arr));//4/8
//地址大小为4/8
printf("%d\n", sizeof(&arr + 1));//4/8
//地址大小为4/8
printf("%d\n", sizeof(&arr[0] + 1));//4/8
//地址大小为4/8
/**********************************************************/
printf("%d\n", strlen(arr));//6
//数组长度为6
printf("%d\n", strlen(arr + 0));//6
//没有变化
//printf("%d\n", strlen(*arr));//error
//有问题
//printf("%d\n", strlen(arr[1]));//error
//有问题
printf("%d\n", strlen(&arr));//6
//整个数组,长度为6
printf("%d\n", strlen(&arr + 1));//随机值
//&arr+1后的'\0‘位置不确定
printf("%d\n", strlen(&arr[0] + 1));//5
//从第二个元素的地址开始
return 0;
}
3
#include <stdio.h>
#include <string.h>
int main()
{
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));
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));
return 0;
}
代码解析:
#include <stdio.h>
#include <string.h>
int main()
{
char* p = "abcdef";
printf("%d\n", sizeof(p));//4/8
//p为指针变量,大小为4/8
printf("%d\n", sizeof(p + 1));//4/8
//地址大小为4/8
printf("%d\n", sizeof(*p));//1
//就是第一个元素
printf("%d\n", sizeof(p[0]));//1
//第一个元素
printf("%d\n", sizeof(&p));//4/8
//地址就是4/8
printf("%d\n", sizeof(&p + 1));//4/8
//地址就是4/8
printf("%d\n", sizeof(&p[0] + 1));//4/8
//地址就是4/8
/*********************************************************/
printf("%d\n", strlen(p));//6
//从首元素地址开始到结束6个元素
printf("%d\n", strlen(p + 1));//5
printf("%d\n", strlen(*p));//error
printf("%d\n", strlen(p[0]));//error
printf("%d\n", strlen(&p));//随机值
//在p的角度上,后面的'\0'不确定
printf("%d\n", strlen(&p + 1));//随机值
//还是随机值
printf("%d\n", strlen(&p[0] + 1));//5
//从第二个元素的地址开始
return 0;
}
二维数组
#include <stdio.h>
int main()
{
int a[3][4] = {
0 };
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]));
return 0;
}
代码解析:
#include <stdio.h>
int main()
{
int a[3][4] = {
0 };
printf("%d\n", sizeof(a));//48
//3行4列,12*4=48
printf("%d\n", sizeof(a[0][0]));//4
//第一行第一列元素
printf("%d\n", sizeof(a[0]));//16
//第一行:即是一维数组的大小:4*4=16
printf("%d\n", sizeof(a[0] + 1));//4/8
//a[0]代表的是第一行整个一维数组首元素的地址,既第一行第一列的地址
//a[0]+1就是第一行第二列的地址,是地址就是4/8
printf("%d\n", sizeof(*(a[0] + 1)));//4
//就是第一行第二列的元素,大小是4个字节
printf("%d\n", sizeof(a + 1));//4/8
//a虽然二维数组的地址,但是并没有单独放在sizeof内部,也没取地址
//a表示首元素的地址,二维数组的首元素是它的第一行,a就是第一行的地址
//a+1就是跳过第一行,表示第二行的地址
//地址就是4/8个字节
printf("%d\n", sizeof(*(a + 1)));//16
//相当于第二行的大小
printf("%d\n", sizeof(&a[0] + 1));//4/8
//&a[0]得到的是第一行的地址
//&a[0]+1得到的是第二行的地址
//地址大小就是4/8
printf("%d\n", sizeof(*(&a[0] + 1)));//16
//得到的是第二行的大小
printf("%d\n", sizeof(*a));//16
//a表示首元素的地址,就是第一行的地址
//*a就是第一行地址的解引用,取到的就是第一行
//第一行的大小就是16
printf("%d\n", sizeof(a[3]));//16
//这里可能会有人说越界访问了,会有问题
//但是实际上并不会:
//我们并没有对其进行操作,只是访问
//可以举个例子:int a = 10;sizeof(int);sizeof(a);
//我们计算a的时候,只需要知道a的类型就知道几个字节了
//对于a[3]也是一样的道理,类型是确定的,所以为16
return 0;
}
总结
我们要理解数组名所代表的含义是什么
知道sizeof()和strlen()的作用
对指针的理解把握,所涉及的内容
通过这些指针与数组的题目练习,我们对指针又有了新的理解,达到了本篇博客的目的。就先到这里结束了
边栏推荐
- 18_ The wechat video number of wechat applet scrolls and automatically plays the video effect to achieve 2.0
- Assets, vulnerabilities, threats and events of the four elements of safe operation
- FPGA - 7 Series FPGA internal structure clocking -04- multi area clock
- MySQL foundation 05 DML language
- 【第29天】给定一个整数,请你求出它的因子数
- Daily topic: movement of haystack
- 强化学习 Q-learning 实例详解
- Initial order of pointer (basic)
- 鏈錶內指定區間反轉
- leetcode 2097 — 合法重新排列数对
猜你喜欢
leetcode 6103 — 从树中删除边的最小分数
MySQL
FPGA - 7系列 FPGA内部结构之Clocking -04- 多区域时钟
Excel removes the data after the decimal point and rounds the number
Basic remote connection tool xshell
[AUTOSAR eight OS]
Machine learning terminology
Data analysis, thinking, law breaking and professional knowledge -- analysis method (I)
MySQL
拥抱平台化交付的安全理念
随机推荐
[AUTOSAR VI description document]
The R language uses the ctree function in the party package to build conditional inference decision trees, uses the plot function to visualize the trained conditional inference decision tree, and the
这不平凡的两年,感谢我们一直在一起!
详解RDD基本概念、RDD五大属性
ROS2之ESP32简单速度消息测试(极限频率)
[overview of AUTOSAR three RTE]
【C语言】分支和循环语句(上)
Excel removes the data after the decimal point and rounds the number
[AUTOSAR XIII NVM]
Database SQL language 02 connection query
Explain the basic concepts and five attributes of RDD in detail
【无标题】
鏈錶內指定區間反轉
Basic use of sringcloud & use of component Nacos
Foundations of data science is free to download
R language ggplot2 visual faceting, visual facet_wrap bar plot, using strip Text function customize the size of the strip of each facet title in the facet graph (cutimi
How to convert Quanzhi a40i/t3 to can through SPI
RISA rz/g2l processor introduction | frame diagram | power consumption | schematic diagram and hardware design guide
[shutter] image component (configure local GIF image resources | load placeholder with local resources)
Daily topic: movement of haystack