指针和数组笔试题目解析

简介: 指针和数组笔试题目解析

前言

我们在前面已经学完了指针和数组的相关知识 接下来我们用下面这些问题来考验下我们对于知识的掌握

程度到底如何 掌握的是否扎实

一. 一维数组

int main()
{
    int a[] = {1,2,3,4};
    printf("%d\n",sizeof(a));//1
    我们首先看第一条  我们在前面的学习中学到了 sizeof(a)其中a是整个数组的意思
    所以说 第一条打印的结果是16
    printf("%d\n",sizeof(a+0));//2
    再来看第二条 这里面的a不是sizeof里面的前面也没有&符号 所以说他就是个首元素地址 它在32位置系统
    上大小是4 在64位系统上大小是8
    printf("%d\n",sizeof(*a));//3
    这里的a是首元素地址大家应该都能理解了吧 对它进行解引用得到的是一个整型 1 是int类型 大小是4个字节
    printf("%d\n",sizeof(a+1));//4
    首元素地址加一 还是一个地址 地址的大小是4或者8 值得一提的是这个地址应该是指向2的
    printf("%d\n",sizeof(a[1]));//5
    这里的a{1}的意思和*(a+1)是一样的 是第二个元素的意思 大小是4个字节
    printf("%d\n",sizeof(&a));//6
    这里的&a取出的是整个数组的地址 但是因为是一个地址 所以大小是4/8
    printf("%d\n",sizeof(*&a));//7
    &a是取出整个数组的地址 然后解引用一下自然就得到了整个数组啦 计算整个数组的大小 就是16
    printf("%d\n",sizeof(&a+1));//8
    这里的取地址a是取出整个数组的地址 然后加一 向后移动一整个数组的距离 但是还是地址 地址大小4/8
    printf("%d\n",sizeof(&a[0]));//9
    a{0}就是等价于*(a+0)取出首元素的内容 再取地址 所以是4/8 
    printf("%d\n",sizeof(&a[0]+1));//10
    还是地址  4/8
    return 0;
}

运行结果如下:

二. 字符数组

int main()
{
  char arr[] = { 'a','b','c','d','e','f' };
  我们先来分析下这个数组  它有六个元素 每个元素都是char类型
  printf("%d\n", sizeof(arr));
  前面讲过的arr表示数组的两个情况  大家应该还记得把
  所以说 此时arr的大小是6
  printf("%d\n", sizeof(arr + 0));
  这个时候arr表示的首元素地址加上0表示的还是首元素地址 大小是4/8
  printf("%d\n", sizeof(*arr));
  对首地址进行解引用 此时表示的是一个字符 
  所以说大小是1
  printf("%d\n", sizeof(arr[1]));
  这个已经讲过很多遍了 arr{1}表示的和*(arr+1)一样 
  表示的是第二个元素b 所以大小是1
  printf("%d\n", sizeof(&arr));
  这里是一个地址 所以大小是4/8
  printf("%d\n", sizeof(&arr + 1));
  是一个地址 所以大小是4/8
  printf("%d\n", sizeof(&arr[0] + 1));
  是一个地址 所以大小是4/8
  不过这里值得一提的是 它其实是对第一个元素取地址然后加一 
    
  printf("%d\n", strlen(arr));
  strlen要到找到‘\0’才会停止 所以说会是一个随机值
  值得注意的是这里的arr是首元素地址传进去的
  printf("%d\n", strlen(arr + 0));
  arr+0也是首元素地址 所以说还会使随机值
  printf("%d\n", strlen(*arr));
  这里对arr进行解引用就是拿到了第一个字符‘a’ 也就是97 这个地址是被禁止访问的
  所以说会报错
  printf("%d\n", strlen(arr[1]));
  这里的arr{1}的意思也是提到过很多次了
  就是对于*(arr+1) 拿出来的是第二个元素 
  所以说会报错
  printf("%d\n", strlen(&arr));
  这里还是传进去的首元素地址 所以说还是一个随机值
  printf("%d\n", strlen(&arr + 1));
  这里传递进去的是跳过6个元素的地址 
  所以说还是一个随机值
  printf("%d\n", strlen(&arr[0] + 1));
  这里是首元素地址跳过一个元素的地址
  所以说还是一个随机值
  return 0;
}

运行结果如下:

三. 字符串

int main()
{
  char arr[] = "abcdef";
  这里其实除了abcdef之外还有个/0字符
  printf("%d\n", sizeof(arr));
  因为上面的解释 这里有7个字符
  printf("%d\n", sizeof(arr + 0));
  这里传递进去的其实是首元素地址 
  地址的大小当然就是4/8
  printf("%d\n", sizeof(*arr));
  这里对于arr进行解引用 所以说是一个a字符
  大小是一个字节 
  printf("%d\n", sizeof(arr[1]));
  arr{1}实际上就是*(arr+1) 是b字符
  大小是一个字节
  printf("%d\n", sizeof(&arr));
  取地址arr取出的是整个数组的地址 实际上就是地址 大小是4/8个字节
  printf("%d\n", sizeof(&arr + 1));
  是一个地址 大小是4/8个字节 
  这里要注意的是跳过了7个元素
  printf("%d\n", sizeof(&arr[0] + 1));
  是一个地址 大小是4/8个字节
  跳过了一个元素
 
 
  printf("%d\n", strlen(arr));
  这里传递进去的实际上是首元素地址 
  所以说字符串长度是6个字节
  printf("%d\n", strlen(arr + 0));
  实际上传递进去是首元素地址
  所以说字符串长度是6个字节
  printf("%d\n", strlen(*arr));
  对于arr进行解引用的话实际上传递进去的是’a‘ 
  而求长度实际上要传递进去一个地址 所以说会报错
  printf("%d\n", strlen(arr[1]));
  会报错 原因同上
  printf("%d\n", strlen(&arr));
  这里取地址 取出的是首元素地址
  字符串长度是6
  printf("%d\n", strlen(&arr + 1));
  这里会传递进去的是’/0‘后面的地址 
  长度会是一个随机值
  printf("%d\n", strlen(&arr[0] + 1));
  这里是从b开始检测字符串长度的
  长度是5
  return 0;
}

四. 字符指针

int main()
{
  char* p = "abcdef";
  printf("%d\n", sizeof(p));
  这里的p是一个指针 所以说它的大小是4/8
  printf("%d\n", sizeof(p + 1));
  这里指针加减整数之后还是指针 所以说大小还是4/8
  printf("%d\n", sizeof(*p));
  对p进行解引用 解引用出来得到字符a 所以说大小是一个字节
  printf("%d\n", sizeof(p[0]));
  这里的p{0}其实就相当于*(p+0)得到的是字符a 所以大小是一个字节
  printf("%d\n", sizeof(&p));
  对于指针p进行取地址 实际上就是一个地址 大小是4/8个字节
  printf("%d\n", sizeof(&p + 1));
  地址加一还是一个地址 所以说大小还是4/8个字节 
  printf("%d\n", sizeof(&p[0] + 1));
  这里先出去的是a的地址 加一 还是一个地址 所以说是4/8个字节
 
  printf("%d\n", strlen(p));
  p指向的是a的地址 
  所以说字符串长度会是6
  printf("%d\n", strlen(p + 1));
  p加一指向的是b的地址
  所以说字符串长度会是5
  printf("%d\n", strlen(*p));
  传递进去的是’a‘这个字符 
  所以说会报错
  printf("%d\n", strlen(p[0]));
  这里的传递进去的还是’a‘这个字符
  所以说会报错
  printf("%d\n", strlen(&p));
  将指针p的地址传递进去 会是一个随机值
  printf("%d\n", strlen(&p + 1));
  同上 随机值
  printf("%d\n", strlen(&p[0] + 1));
  这里其实是一个指针指向’b‘
  所以说长度是5个字节
  return 0;
}

五. 二维数组

int main()
{
  char* p = "abcdef";
  printf("%d\n", sizeof(p));
  这里的p是一个指针 所以说它的大小是4/8
  printf("%d\n", sizeof(p + 1));
  这里指针加减整数之后还是指针 所以说大小还是4/8
  printf("%d\n", sizeof(*p));
  对p进行解引用 解引用出来得到字符a 所以说大小是一个字节
  printf("%d\n", sizeof(p[0]));
  这里的p{0}其实就相当于*(p+0)得到的是字符a 所以大小是一个字节
  printf("%d\n", sizeof(&p));
  对于指针p进行取地址 实际上就是一个地址 大小是4/8个字节
  printf("%d\n", sizeof(&p + 1));
  地址加一还是一个地址 所以说大小还是4/8个字节 
  printf("%d\n", sizeof(&p[0] + 1));
  这里先出去的是a的地址 加一 还是一个地址 所以说是4/8个字节
 
  printf("%d\n", strlen(p));
  p指向的是a的地址 
  所以说字符串长度会是6
  printf("%d\n", strlen(p + 1));
  p加一指向的是b的地址
  所以说字符串长度会是5
  printf("%d\n", strlen(*p));
  传递进去的是’a‘这个字符 
  所以说会报错
  printf("%d\n", strlen(p[0]));
  这里的传递进去的还是’a‘这个字符
  所以说会报错
  printf("%d\n", strlen(&p));
  将指针p的地址传递进去 会是一个随机值
  printf("%d\n", strlen(&p + 1));
  同上 随机值
  printf("%d\n", strlen(&p[0] + 1));
  这里其实是一个指针指向’b‘
  所以说长度是5个字节
  return 0;
}

以上便是本篇所有内容了,如有错误各位大佬不吝赐教,感谢留言

目录
相关文章
|
10月前
使用指针访问数组元素
【10月更文挑战第30天】使用指针访问数组元素。
118 3
|
9月前
|
存储 程序员 C++
深入解析C++中的函数指针与`typedef`的妙用
本文深入解析了C++中的函数指针及其与`typedef`的结合使用。通过图示和代码示例,详细介绍了函数指针的基本概念、声明和使用方法,并展示了如何利用`typedef`简化复杂的函数指针声明,提升代码的可读性和可维护性。
254 1
|
10月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
10月前
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
|
10月前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
10月前
|
容器
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
|
10月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
196 4
|
10月前
使用指针访问数组元素
【10月更文挑战第31天】使用指针访问数组元素。
115 2
|
10月前
|
算法 索引
单链表题+数组题(快慢指针和左右指针)
单链表题+数组题(快慢指针和左右指针)
102 1
|
11月前
|
存储
如何使用指针数组来实现动态二维数组
指针数组可以用来实现动态二维数组。首先,定义一个指向指针的指针变量,并使用 `malloc` 为它分配内存,然后为每个子数组分配内存。通过这种方式,可以灵活地创建和管理不同大小的二维数组。

推荐镜像

更多
  • DNS