【c语言】指针和数组笔试题

1.指针和数组笔试题解析

一维数组

	int a[] = { 1,2,3,4 };
	printf("%d\n", sizeof(a));//a单独放在sizeof内表示求整个数组的字节-----16
	printf("%d\n", sizeof(a + 0));//a不是单独放在sizeof内部,表明是首元素的地址,地址占4/8个字节,32位机器占4个字节
	printf("%d\n", sizeof(*a));//a为首元素的地址,*a就是数组第一个元素,大小为4个字节
	printf("%d\n", sizeof(a + 1));//a不是单独放在sizeof内,a表示首元素地址,+1为第二个元素地址,地址占4/8个字节,32位机器占4个字节
	printf("%d\n", sizeof(a[1]));//a[1]为第二个元素,大小为int 4个字节
	printf("%d\n", sizeof(&a));//&a表示整个数组的地址,是地址就占4/8个字节,32位机器占四个字节
	printf("%d\n", sizeof(*&a));//取地址解引用相当于sizeof(a),a单独放在sizeof内表示求整个数组的字节-----16
	printf("%d\n", sizeof(&a + 1));//&a为取出整个数组的地址,+1,直接跳过整个数组,指向数组的尾,但是还是地址,地址就占4/8个字节
	printf("%d\n", sizeof(&a[0]));//&a[0]为第一个元素地址,地址占4/8个字节,32位机器占4个字节
	printf("%d\n", sizeof(&a[0] + 1));//&a[0]为第一个元素地址,+1为第二个元素地址,地址占4/8个字节。

字符数组

char arr[] = { 'a','b','c','d','e','f' }; 
	printf("%d\n", sizeof(arr));//arr单独放在sizeof内表示求整个数组的字节-----6
	printf("%d\n", sizeof(arr + 0));//arr不是单独放在sizeof内部,+0相当于第一个元素的地址,地址占4/8个字节,32位机器占4个字节
	printf("%d\n", sizeof(*arr));//arr不是单独放在sizeof内部,arr为首地址,解引用拿到第一个元素,占一个字节
	printf("%d\n", sizeof(arr[1]));//第二个元素,占一个字节
	printf("%d\n", sizeof(&arr));//整个数组的地址,地址占4/8个字节,32位机器占4个字节
	printf("%d\n", sizeof(&arr + 1)); //&arr为取出整个数组的地址, + 1,直接跳过整个数组,指向数组的尾,但是还是地址,地址就占4 / 8个字节,32位机器占4个字节
	printf("%d\n", sizeof(&arr[0] + 1));//&arr[0]第一个元素的地址,+1为第二个元素地址,但是还是地址,地址就占4 / 8个字节,32位机器占4个字节
	printf("%d\n", strlen(arr));//从arr地址开始找'\0',--------随机数(字符数组没带反斜杠0)
	printf("%d\n", strlen(arr + 0));//arr+0为第一个元素地址开始找'\0'-------随机数(字符数组没带反斜杠0)
	printf("%d\n", strlen(*arr));//arr为首元素地址,对其解引用拿到的是第一个元素,strlen把他当做地址往后找'\0'-------奔溃
	printf("%d\n", strlen(arr[1]));//arr[1]为第二个元素,strlen把他当做地址往后找'\0'-------奔溃
	printf("%d\n", strlen(&arr));//&arr为整个数组的地址,strlen把他当做地址往后找'\0'-------随机数
	printf("%d\n", strlen(&arr + 1)); //&arr为整个数组的地址,+1跳过数组,跳到这个地址往后找'\0'-------随机数
	printf("%d\n", strlen(&arr[0] + 1));//&arr[0]为第一个元素地址,然后+1就是第2个元素的地址开始找'\0'--------随机数(字符数组没带反斜杠0)

字符串数组

char arr[] = "abcdef";
	printf("%d\n", sizeof(arr));//arr单独放在sizeof内表示求整个数组的字节-----7(字符串数组末尾有个反斜杠0)
	printf("%d\n", sizeof(arr + 0));//arr没单独放在内部,+0,表示第一个元素地址,但是还是地址,地址就占4 / 8个字节,32位机器占4个字节
	printf("%d\n", sizeof(*arr));//arr没单独放在内部,arr为元素首地址,*arr拿到第一个元素,1个字节
	printf("%d\n", sizeof(arr[1]));//arr[1]为第二个元素,为1个字节
	printf("%d\n", sizeof(&arr));//&arr为整个数组的地址,但是还是地址,地址就占4 / 8个字节,32位机器占4个字节
	printf("%d\n", sizeof(&arr + 1));//&arr为整个数组的地址,+1跳过这个数组,的地址,但是还是地址,地址就占4 / 8个字节,32位机器占4个字节
	printf("%d\n", sizeof(&arr[0] + 1));//&arr[0]为第一个元素地址,+1为第二个元素地址,地址就占4 / 8个字节,32位机器占4个字节






	printf("%d\n", strlen(arr));//arr为首元素地址,从arr地址往后开始找'\0'-------6
	printf("%d\n", strlen(arr + 0));//arr+0为首元素地址,从arr地址往后开始找'\0'-------6
	printf("%d\n", strlen(*arr));//arr为首元素地址,解引用为第一个元素,把第一个元素当地址往后找反斜杠0------奔溃
	printf("%d\n", strlen(arr[1]));//arr[1]为第二个元素,把第二个元素当地址往后找反斜杠0------奔溃
	printf("%d\n", strlen(&arr));//&arr为整个数组的地址,strlen把他当做地址往后找'\0'-------6
	printf("%d\n", strlen(&arr + 1));//&arr为整个数组的地址, + 1跳过数组,跳到这个地址往后找'\0'------ - 随机数
	printf("%d\n", strlen(&arr[0] + 1));//&arr[0]为第一个元素地址,然后 + 1就是第2个元素的地址开始找'\0'------5

指针保存字符串数组首地址

	char* p = "abcdef";
	printf("%d\n", sizeof(p));//p保存的是字符串首元素的地址,地址就占4 / 8个字节,32位机器占4个字节
	printf("%d\n", sizeof(p + 1)); //p保存的是字符串首元素的地址,+1为第二个元素地址,地址就占4 / 8个字节,32位机器占4个字节
	printf("%d\n", sizeof(*p)); //p保存的是字符串首元素的地址,对他解引用得到的是第一个元素,占一个字节
	printf("%d\n", sizeof(p[0]));//p[0]相当于*(p+0),第一个元素占一个字节
	printf("%d\n", sizeof(&p)); //p指针的地址,但是还是地址,地址就占4 / 8个字节,32位机器占4个字节
	printf("%d\n", sizeof(&p + 1)); //p指针的地址+1,还是地址,地址就占4 / 8个字节,32位机器占4个字节
	printf("%d\n", sizeof(&p[0] + 1));//p[0]相当于第一个元素,&p[0]相当于第一个元素地址,&p[0] + 1为第二个元素地址,地址就占4 / 8个字节,32位机器占4个字节

	printf("%d\n", strlen(p));//p保存的是字符串首元素的地址,从首元素地址开始往后找反斜杠0--------6
	printf("%d\n", strlen(p + 1));//p保存的是字符串首元素的地址,+1为第二个元素地址开始往后找反斜杠0--------5
	printf("%d\n", strlen(*p));//p保存的是字符串首元素的地址,解引用为第一个元素,strlen把他当地址开始往后找反斜杠0------奔溃
	printf("%d\n", strlen(p[0]));//p[0]为首元素,将a的ascll码值当地址开始往后找反斜杠0------奔溃
	printf("%d\n", strlen(&p));//p指针的地址,开始往后找反斜杠0-----随机值
	printf("%d\n", strlen(&p + 1)); //p指针的地址+1,开始往后找反斜杠0-----随机值
	printf("%d\n", strlen(&p[0] + 1));//p[0]相当于第一个元素,&p[0]相当于第一个元素地址,&p[0] + 1为第二个元素地址开始往后找反斜杠0-------5

二维数组

	int a[3][4] = { 0 };
	printf("%d\n", sizeof(a));//a单独放在sizeof内表示求整个数组的字节------3*4*4=48
	printf("%d\n", sizeof(a[0][0]));//第一个元素,大小为4个字节
	printf("%d\n", sizeof(a[0]));//a[0]相当于数组名---*(a+0)---*a,如果是一维数组a表示首元素的地址,二维数组a表示第一行数组的地址,相当于把第一行整个数组放在sizeof内部,*a表示第一行元素,4*4=16;
	printf("%d\n", sizeof(a[0] + 1));//a[0]相当于数组名,但是没有单独放在sizeof内部,相当于第一行第一个元素地址,+1为第一行第二个元素地址,地址就占4 / 8个字节,32位机器占4个字节
	printf("%d\n", sizeof(*(a[0] + 1)));//上一个说(a[0] + 1)这个是第二个元素的地址,对其解引用得到的是第二个元素,为4个字节
	printf("%d\n", sizeof(a + 1));//a没有单独放在sizeof内,表示第一行的地址,+1表示第二行的地址,地址就占4 / 8个字节,32位机器占4个字节
	printf("%d\n", sizeof(*(a + 1)));//上一个说a + 1为第二行的地址,对其解引用得到第二行,4*4=16;
	printf("%d\n", sizeof(&a[0] + 1));//&a[0]为第一行的地址,&a[0] + 1为第二行的地址,地址就占4 / 8个字节,32位机器占4个字节
	printf("%d\n", sizeof(*(&a[0] + 1)));//第二行的地址解引用得到第二行,4*4=16;
	printf("%d\n", sizeof(*a));//a没有单独放在sizeof内,a表示第一行的地址,*a得到是第一行,4*4=16;
	printf("%d\n", sizeof(a[3]));//sizeof(a[3])直接会被替换成sizeof(a[0]),不会访问a[3]的地址,不会越界访问--16

2.总结

  1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
  2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
  3. 除此之外所有的数组名都表示首元素的地址。

3.指针笔试题

笔试题1:

int main()
{
    inta[5] = { 1, 2, 3, 4, 5 };
    int*ptr= (int*)(&a+1);
    printf( "%d,%d", *(a+1), *(ptr-1));    return0;
}
//程序的结果是什么?

分析:
在这里插入图片描述
在这里插入图片描述

笔试题2

//由于还没学习结构体,这里告知结构体的大小是20个字节
struct Test
{
	int Num;
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}*p;
//假设p 的值为0x100000。如下表表达式的值分别为多少?
int main()
{
	printf("%p\n", p + 0x1);
	printf("%p\n", (unsigned long)p + 0x1);
	printf("%p\n", (unsigned int*)p + 0x1);
	return 0;
}

分析:1. p为结构体指针,+1相当于跳过一个结构体大小,这里告知结构体的大小是20个字节,p + 0x1按16进制打印出来是0x100014
2. p转化为无符号 长整型,并非指针,+1,就是+1,0x100001
3. p转化为无符号整型类型指针+1跳过四个字节。0x100004
由于以%p打印,第一个00100014,第二个00100001,第三个00100004
在这里插入图片描述
他这里的p的值为0x000000

笔试题3:

int main()
{
    inta[4] = { 1, 2, 3, 4 };
    int*ptr1= (int*)(&a+1);
    int*ptr2= (int*)((int)a+1);
    printf( "%x,%x", ptr1[-1], *ptr2);    return0;
}

分析:在这里插入图片描述
在这里插入图片描述

笔试题4:

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

分析:==注意里面不是这种{}==所以是逗号表达式在这里插入图片描述
在这里插入图片描述

笔试题5:

int main()
{
	int a[5][5];
	int(*p)[4];
	p = a;
	printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]); 
	return 0;
}

分析:
在这里插入图片描述
在这里插入图片描述

笔试题6:

int main()
{
    intaa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };    
    int*ptr1= (int*)(&aa+1);
    int*ptr2= (int*)(*(aa+1));
    printf( "%d,%d", *(ptr1-1), *(ptr2-1));
    return 0;
}

分析:在这里插入图片描述

在这里插入图片描述

笔试题7:

int main() 
{
	char* a[] = { "work","at","alibaba" };
	char** pa = a;
	pa++;
	printf("%s\n", *pa);
	return 0;
}

分析

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

笔试题8:

int main()
{
	char* c[] = { "ENTER","NEW","POINT","FIRST" };
	char** cp[] = { c + 3,c + 2,c + 1,c };
	char*** cpp = cp;
	printf("%s\n", **++cpp);
	printf("%s\n", *-- * ++cpp + 3);
	printf("%s\n", *cpp[-2] + 3);
	printf("%s\n", cpp[-1][-1] + 1);
	return 0;
}

分析

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

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

CSDN海神之光上传的代码均可运行,亲测可用,直接替换数据即可,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b或2023b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作 功率谱估计: 故障诊断分析: 雷达通信:雷达LFM、MIMO、成像、定位、干扰、检测、信号分析、脉冲压缩 滤波估计:SOC估计 目标定位:WSN定位、滤波跟踪、目标定位 生物电信号:肌电信号EMG、脑电信号EEG、心电信号ECG 通信系统:DOA估计、编码译码、变分模态分解、管道泄漏、滤波器、数字信号处理+传输+分析+去噪(CEEMDAN)、数字信号调制、误码率、信号估计、DTMF、信号检测识别融合、LEACH协议、信号检测、水声通信 1. EMD(经验模态分解,Empirical Mode Decomposition) 2. TVF-EMD(时变滤波的经验模态分解,Time-Varying Filtered Empirical Mode Decomposition) 3. EEMD(集成经验模态分解,Ensemble Empirical Mode Decomposition) 4. VMD(变分模态分解,Variational Mode Decomposition) 5. CEEMDAN(完全自适应噪声集合经验模态分解,Complementary Ensemble Empirical Mode Decomposition with Adaptive Noise) 6. LMD(局部均值分解,Local Mean Decomposition) 7. RLMD(鲁棒局部均值分解, Robust Local Mean Decomposition) 8. ITD(固有时间尺度分解,Intrinsic Time Decomposition) 9. SVMD(逐次变分模态分解,Sequential Variational Mode Decomposition) 10. ICEEMDAN(改进的完全自适应噪声集合经验模态分解,Improved Complementary Ensemble Empirical Mode Decomposition with Adaptive Noise) 11. FMD(特征模式分解,Feature Mode Decomposition) 12. REMD(鲁棒经验模态分解,Robust Empirical Mode Decomposition) 13. SGMD(辛几何模态分解,Spectral-Grouping-based Mode Decomposition) 14. RLMD(鲁棒局部均值分解,Robust Intrinsic Time Decomposition) 15. ESMD(极点对称模态分解, extreme-point symmetric mode decomposition) 16. CEEMD(互补集合经验模态分解,Complementary Ensemble Empirical Mode Decomposition) 17. SSA(奇异谱分析,Singular Spectrum Analysis) 18. SWD(群分解,Swarm Decomposition) 19. RPSEMD(再生相移正弦辅助经验模态分解,Regenerated Phase-shifted Sinusoids assisted Empirical Mode Decomposition) 20. EWT(经验小波变换,Empirical Wavelet Transform) 21. DWT(离散小波变换,Discraete wavelet transform) 22. TDD(时域分解,Time Domain Decomposition) 23. MODWT(最大重叠离散小波变换,Maximal Overlap Discrete Wavelet Transform) 24. MEMD(多元经验模态分解,Multivariate Empirical Mode Decomposition) 25. MVMD(多元变分模态分解,Multivariate Variational Mode Decomposition)
评论 53
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

#小多子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值