C语言数组和指针笔试题(一)(一定要看)

目录

  • 一维数组
    • 例题1
    • 例题2
    • 例题3
    • 例题4
    • 例题5
    • 例题6
    • 例题7
    • 例题8
    • 例题9
    • 例题10
    • 例题输出结果
  • 字符数组一
    • 例题1
    • 例题2
    • 例题3
    • 例题4
    • 例题5
    • 例题6
    • 例题7

一维数组

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

例题1

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

这里的a表示整个数组,计算的是整个数组的大小,因此这里的结果为
4(数组元素) * 4(int类型所占大小)=16

例题2

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

注意这里a+0的a并不是整个数组,而是表示的首元素的地址
因为只有数组名单独在sizeof()括号里时,才表示整个数组,当数组名不是单独在sizeof()括号里时就仅表示数组首元素地址,虽然二者地址是一样的,但是本质是有区别的,因此a+0实际为&a[0],&a[0]的大小为4或者8个字节
为什么这里a+0!=a[0]呢?,因为a+0本质还是一个地址,而a[0]就是数组的一个元素,并不是地址,因此只有*(a+0)才等于a[0]

例题3

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

*a是数组的首元素,即 * a=a[0],sizeof(a[0])=4(整形类型的大小)

例题4

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

这道题其实和例题2基本上是一样的,a+1表示的是数组首元素的地址往后移一位,即a+1=a[1],因此为sizeof(a+1)的结果为4或者8个字节
这里其实可以直接得出答案,因为我们知道这里的a是首元素地址,因此既然a+1还是地址,那么地址的大小就是4或者8个字节

例题5

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

计算的是第二个元素的大小为4个字节(int类型的大小)

例题6

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

&a在之前我的一篇博客中有提到,能取整个数组地址的方式只有两种,一种是sizeof(数组名),另一种则是&(数组名)
因此**&a是整个数组的地址,既然是地址那么结果还是4或者8个字节**

例题7

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

这里的**&a是整个数组的地址**,* 对整个数组解引用,因此sizeof( *&a)就是计算的整个数组的大小,所以结果就是16

例题8

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

&a是表示整个数组的地址,这里的+1不是让数组的首元素地址移动到下一位,而是直接跳过整个数组
在这里插入图片描述
既然是数组的地址,那么依然是4或者8个字节

例题9

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

&a[0]是取的数组首元素地址,所以大小为4或者8个字节

例题10

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

上题已经说了既然是首元素地址,因此这里的+1就是跳到下一个元素的地址,&a[0]+1=&a[1],大小是4或者8个字节

例题输出结果

在这里插入图片描述

字符数组一

char arr[] = "abcdef";
1:printf("%d\n", sizeof(arr));
2:printf("%d\n", sizeof(arr+0));
3:printf("%d\n", sizeof(*arr));
4:printf("%d\n", sizeof(arr[1]));
5:printf("%d\n", sizeof(&arr));
6:printf("%d\n", sizeof(&arr+1));
7:printf("%d\n", sizeof(&arr[0]+1));

例题1

char arr[] = "abcdef";
1:printf("%d\n", sizeof(arr));

由于sizeof是只管求数组里的内存大小,而对于字符串是由字符’a’ ‘b’ ‘c’ ’ d’ ‘e’ ‘f’ '\0’组成,而一个字符的大小为一个字节,因此最后的输出结果为
7(字符串中的字符个数)*1(一个字符的内存大小)=7

例题2

char arr[] = "abcdef";
1:printf("%d\n", sizeof(arr+0));

arr+0在之前说过,这里的arr不是整个数组的地址,是首元素的地址,因此arr+0=arr[0],既然是地址那么结果就是4或者8

例题3

char arr[] = "abcdef";
1:printf("%d\n", sizeof(*arr));

arr为数组首元素地址,对arr解引用就是数组的第一个字符a,因为是char类型,所以结果就是1

例题4

char arr[] = "abcdef";
1:printf("%d\n", sizeof(arr[1]));

这里求的是第二个字符b,所以结果是1

例题5

char arr[] = "abcdef";
1:printf("%d\n", sizeof(&arr));

&arr是整个数组的地址,所以既然是地址那么结果就是4或者8

例题6

char arr[] = "abcdef";
1:printf("%d\n", sizeof(&arr+1));

&arr+1是跳过整个数组,但是仍然是地址,所以还是4或者8

例题7

char arr[] = "abcdef";
1:printf("%d\n", sizeof(arr[0]+1));

arr[0]+1跳过一个元素,所以就是arr[1],但是还是地址,所以仍然是4或者8

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/108073.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法系列 | 8】深入解析查找算法之—二分查找

序言 心若有阳光,你便会看见这个世界有那么多美好值得期待和向往。 决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。 我们一起努力,成为更好的自己! 今天第8讲,讲一…

Linux中执行bash脚本报错/bin/bash^M: bad interpreter: No such file or directory

文章目录 参考博客: Linux中执行bash脚本报错/bin/bash^M: bad interpreter: No such file or directory 首先在此对这位博主表示感谢。 运行bash脚本会出现两个文件,1037.err和1037.out。 1037.err的文件内容如下: /data/home/user12/.lsbat…

C++ std::future

std::future是用来接收一个线程的执行结果的,并且是一次性的。 共享状态shared state future可以关联一个共享状态,共享状态是用来储存要执行结果的。这个结果是async、promise、packaged_task设置的,且这个结果只能设置一次。 创建future …

NLP机器翻译全景:从基本原理到技术实战全解析

目录 一、机器翻译简介1. 什么是机器翻译 (MT)?2. 源语言和目标语言3. 翻译模型4. 上下文的重要性 二、基于规则的机器翻译 (RBMT)1. 规则的制定2. 词典和词汇选择3. 限制与挑战4. PyTorch实现 三、基于统计的机器翻译 (SMT)1. 数据驱动2. 短语对齐3. 评分和选择4. PyTorch实现…

【Linux-day11-线程的创建与同步】

Linux 线程的创建与同步 线程的概念 线程是进程内部的一条执行序列或执行路径,一个进程可以包含多条线程。 进程与线程的区别 进程是资源分配的最小单位,线程是 CPU 调度的最小单位进程有自己的独立地址空间,线程共享进程中的地址空间进…

数据结构基础7:二叉树【链式结构】实现和递归思想。

二叉树的链式结构实现 一.二叉树链式结构的实现:1.前置说明:1.创建二叉树:2.二叉树的结构: 2.二叉树的遍历:1.二叉树的前中后序遍历:2.内容拓展: 二.二叉树链式(题目)题目一:计算节点…

yolov7简化网络yaml配置文件

yolov7代码结构简单,效果还好,但是动辄超过70几个模块的配置文件对于想要对网络进行魔改的朋友还是不怎么友好的,使用最小的tiny也有77个模块 代码的整体结构简单,直接将ELAN结构化写成一个类就能像yolov5一样仅仅只有20几个模块&…

【操作系统】进程控制

进程控制:创建新进程,撤销已有进程,实现进程状态转换等。 原语:进程控制用的程序段。执行期间不允许中断,用"关中断"和"开中断"指令(特权指令)实…

Android性能优化之应用瘦身(APK瘦身)

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、导读二、概览2.1 apk组成 三、优化方向3.1 源代码3.1.1 代码混…

Dedecms最新版--0day分享分析(二)

前言 接上一篇的Tricks,既然利用远程文件下载方式成为了实现RCE的最好方法,毕竟在执行的时候没有恶意shell文件,恶意木马被存放于远端服务器,那么下文的day就是对远程恶意文件的利用。 环境 下载最新版本: https://…

Kotlin Files Paths write ByteArray writeString写多行BufferedWriter

Kotlin Files Paths write ByteArray writeString写多行BufferedWriter import java.nio.file.Files import java.nio.file.Paths import java.nio.file.StandardOpenOptionfun main(args: Array<String>) {val filePath "./myfile.txt"val path Paths.get(…

ModuleNotFoundError: No module named ‘gevent‘

1、先确定pip版本&#xff1a; pip3 list: 看到没有gevent包 如果pip版本不是最新版可以使用命令python -m pip install --upgrade pip进行更新&#xff0c; 2、安装 pip3 install gevent 安装完成