指针和数组笔试题

2023-11-18

一维数组

数组和指针
数组 - 能够存放一组相同类型的元素,数组的大小取决于数组的元素个数和元素类型
指针 - 地址/指针变量 ,大小是4/8个字节
数组是数组,指针是指针,二者不等价
数组名是数组首元素的地址,这个地址就可以存放在指针变量中
我们就可以使用指针来遍历数组
数组名
大部分情况下数组名是数组首元素的地址
但是有2个例外:
sizeof(数组名) - 数组名表示整个数组,计算的是整个数组的大小
&数组名 - 数组名表示整个数组,取出的是数组的地址

int main()
{
	int a[] = { 1,2,3,4 };
	printf("%d\n", sizeof(a));//16
	//sizeof(a)就是数组名单独放在sizeof内部,计算的数组总大小,单位是字节
	printf("%d\n", sizeof(a + 0));//4/8 个字节
	//a+0 其实是数组首元素的地址
	printf("%d\n", sizeof(*a));//4
	//a是数组首元素的地址 - &a[0]
	//*a -> *&a[0] -> a[0]
	printf("%d\n", sizeof(a + 1));//4/8
	//a是数组首元素的地址 -- int*
	//a+1 跳过1个整型, 是第二个元素的地址
	//
	printf("%d\n", sizeof(a[1]));//4
	printf("%d\n", sizeof(&a));//4/8
	//&a - 取出的是数组的地址,但是数组的地址也是地址呀,是地址大小就是4/8字节
	//int (*pa)[4] = &a;//int(*)[4]
	//
	printf("%d\n", sizeof(*&a));//16
	//sizeof(a)
	//int(*)[4]
	//
	printf("%d\n", sizeof(&a + 1));//4/8
	//&a -->  int (*)[4]
	//&a+1 跳过一个数组

	printf("%d\n", sizeof(&a[0]));//取出首元素的地址 4/8
	printf("%d\n", sizeof(&a[0] + 1));//第二个元素的地址

	return 0;
}

字符数组

在这里插入图片描述

int main()
{
	//字符数组
	char arr[] = { 'a','b','c','d','e','f' };

	printf("%d\n", strlen(arr));//随机值,因为不知道\0的位置
	printf("%d\n", strlen(arr + 0));//随机值
	//printf("%d\n", strlen(*arr));//非法访问
	//printf("%d\n", strlen(arr[1]));//'b' - 98 当成地址,形参非法访问
	printf("%d\n", strlen(&arr));//随机值
	printf("%d\n", strlen(&arr + 1));//随机值-6
	printf("%d\n", strlen(&arr[0] + 1));//随机值-1
 

	printf("%d\n", sizeof(arr));//6
	printf("%d\n", sizeof(arr + 0));//arr+0是数组首元素的地址 4/8
	printf("%d\n", sizeof(*arr));//*arr是首元素的,计算的是首元素的大小 1
	printf("%d\n", sizeof(arr[1]));//1
	printf("%d\n", sizeof(&arr));//&arr是数组的地址 4/8
	printf("%d\n", sizeof(&arr + 1));//&arr + 1跳过一个数组后的地址,4/8
	printf("%d\n", sizeof(&arr[0] + 1));//4/8 第二个元素的地址


     return 0;
}

int main()
{   
	//char arr1[] = { 'a','b','c','d','e','f' };

	char arr[] = "abcdef";//[a b c d e f \0]
	printf("%d\n", strlen(arr));//6
	printf("%d\n", strlen(arr + 0));//6
	printf("%d\n", strlen(*arr));//err
	printf("%d\n", strlen(arr[1]));//err
	printf("%d\n", strlen(&arr));//6
	//&arr - char (*)[7]
	printf("%d\n", strlen(&arr + 1));//随机值
	printf("%d\n", strlen(&arr[0] + 1));//5

	printf("%d\n", sizeof(arr));//7
	printf("%d\n", sizeof(arr + 0));//4/8
	printf("%d\n", sizeof(*arr));//*arr -是数组首元素 1
	//arr[0]   *(arr+0)
	//int sz = sizeof(arr)/sizeof(*arr);
	//int sz = sizeof(arr)/sizeof(arr[0]);

	printf("%d\n", sizeof(arr[1]));//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

	return 0;
}

在这里插入图片描述

int main()
{
	char* p = "abcdef";

	printf("%d\n", strlen(p));//6
	printf("%d\n", strlen(p + 1));//p+1是'b'的地址 5
	//printf("%d\n", strlen(*p));//err
	//printf("%d\n", strlen(p[0]));//err
	printf("%d\n", strlen(&p));//随机值
	printf("%d\n", strlen(&p + 1));//随机值
	printf("%d\n", strlen(&p[0] + 1));


	printf("%d\n", sizeof(p));//4 / 8
	printf("%d\n", sizeof(p + 1));//'b'的地址,4/8
	printf("%d\n", sizeof(*p));//1
	printf("%d\n", sizeof(p[0]));//*(p+0)--'a' 1
	printf("%d\n", sizeof(&p));//
	printf("%d\n", sizeof(&p + 1));
	printf("%d\n", sizeof(&p[0] + 1));//&p[0]+1是'b'的地址

	return 0;
}

二维数组

在这里插入图片描述

int main()
{
	int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };

	printf("%d\n", sizeof(a));//48 - a这个二维数组的数组名单独放在sizeof内部,计算整个数组的大小
	printf("%d\n", sizeof(a[0][0]));//第一行第一个元素,4个字节
	printf("%d\n", sizeof(a[0]));//16
	//a[0] 第一行的数组名,这时数组名单独放在sizeof内部了
	//计算的是数组的大小,单位是字节,16
	printf("%d\n", sizeof(a[0] + 1));//4
	//a[0]不是单独放在sizeof内部,a[0]表示的首元素的地址,即第一行第一个元素的地址 - &a[0][0]
	//a[0] + 1 是第一行第2个元素的地址 &a[0][1]
	printf("%d\n", sizeof(*(a[0] + 1)));//a[0][1] 大小是:4个字节
	printf("%d\n", sizeof(a + 1));//
	//a作为二维数组的数组名并非单独放在sizeof内部,所以表示首元素的地址
	//二维数组的首元素是第一行,这里的a就是第一行的地址---  int (*)[4]
	//a+1是跳过第一行,指向了第二行

	printf("%d\n", sizeof(*(a + 1)));//16
	//*(a+1)-->a[1]
	printf("%d\n", sizeof(&a[0] + 1));//4/8
	//&a[0]是第一行的地址
	//&a[0]+1是第二行的地址
	printf("%d\n", sizeof(*(&a[0] + 1)));//16  a[1]
	printf("%d\n", sizeof(*a));//16 *a - 就是第一行
	//*a -- *(a+0) -- a[0]
	printf("%d\n", sizeof(a[3]));//16
	
	//int a = 5;
	//short s = 11;
	//printf("%d\n", sizeof(s = a + 2));//2
	//printf("%d\n", s);//11

	return 0;
}

sizeof内部的表达式不会真的计算,根据类型属性就已经确定结果,arr[3]和arr[0]一样可以推出类型属性,不会去访问也就不存在越界访问了
在这里插入图片描述

对于sizeof(*arr+1):
在这里插入图片描述

指针笔试题

笔试题1:

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

在这里插入图片描述

笔试题2:

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

在这里插入图片描述

笔试题3:

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

在这里插入图片描述

笔试题4:

#include <stdio.h>
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()
{
    int aa[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:

#include <stdio.h>
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;
}

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

指针和数组笔试题 的相关文章

  • C++模板-33-类模板和函数模板的区别

    这篇开始学习类模板相关知识 本篇主要学习什么是类模板 还有类模板和函数模板的区别 1 类模板语法 template
  • Java调试的变迁:从System.out.println到log4j

    jungleford如是说 用惯了VC的人刚接触Java大概很不习惯代码的调试 的确 在M 的大部分IDE都做得相当出色 包括像VJ 这样一直被Java程序员称为是 垃圾 的类库 记得以前在瀚海星云的Java版提有关VJ问题的人是有可能被封

随机推荐

  • linux下python第三库(setuptools)的安装

    rpm源的下载网址 http rpm pbone net http www rpmfind net linux RPM index html python第三方模块的下载网址 https pypi python org pypi setup
  • amd 皓龙 服务器 芯片,全面解读 关于AMD皓龙6000平台的那些事

    今年3月30日 AMD面向全球发布了代号 Magny Cours 的AMD皓龙6100处理器 在4月19日 AMD在上海召开AMD皓龙6000系列平台发布会 标志着AMD皓龙6000平台正式登录中国 在x86服务器处理器中 AMD皓龙堪称一
  • java中的静态方法是什么

    静态方法是使用公共内存空间的 就是说所有对象都可以直接引用 不需要创建对象再使用该方法 然后在含有main方法的类中使用这个类时 对与以上非静态和静态方法的引用方式是不同的 如下 public class mainClass int sum
  • vscode可以调试c但是无法调试c++程序的

    安装Vscode后调试c程序正常 但是调试c 程序出现问题 出现launch program xxxxxx does not exist的问题 我发现是无法正常生成exe文件导致的问题 当我们对c程序进行调试时 可以正常生成exe文件 但是
  • 太牛逼了!从Python入门到入魔

    总被读者问到 我看完了python入门的书 后面就不知道要学什么了 今天就给你们整理全套入门到进阶的教程 这套教程非常全面而且详细 从Python入门到Python进阶 Django Flask等Web框架以及爬虫 数据库 算法与数据结构等
  • 计算机ip保留地址,分类ip地址中,保留地址有哪些?具体点说说,作业。

    分类ip地址中 保留地址有哪些 具体点说说 作业 以下文字资料是由 历史新知网www lishixinzhi com 小编为大家搜集整理后发布的内容 让我们赶快一起来看一下吧 分类ip地址中 保留地址有哪些 具体点说说 作业 A类地址中的私
  • Vue开发组件库

    Vue开发组件库 1 创建项目 npm install g vue cli vue create 项目名 针对于vue脚手架生成的项目需要做出一些调整 将src重命名为examples 防止第三方开发者产生的歧义 添加examples同级目
  • MySQL CRUD (带样例)

    目录 1 Create 创建 1 1 单行数据 全列插入 1 2 多行数据 指定列插入 1 3 插入否则更新 1 4 替换 2 Retrieve 读取 2 1 SELECT 列 全列查询 指定列查询 查询字段为表达式 为查询结果指定别名 结
  • 螺旋式排列数组

    文章目录 前言 解题思路 上代码 总结 前言 螺旋式排列数组在letcode中属于中等难度的题型 但是对于俺这种道行浅的人再次重新拾起正吃灰的C语言的菜鸟来说确实不容易 其实思路不难 按主要是卡在了二维数组空间的分配问题上 最后调试才将代码
  • 【软件测试】selenium3

    自动化测试的概念 自动化测试指软件测试的自动化 在预设状态下运行应用程序或者系统 预设条件包括正常和异常 最 后评估运行结果 将人为驱动的测试行为转化为机器执行的过程 自动化测试就相当于将人工测试手段进行转换 让代码去执行 提高测试效率 保
  • python中的groupby()函数

    1 groupby 函数介绍 groupby 函数扫描整个序列并且查找连续相同值 或者根据指定key函数返回值相同 的元素序列 在每次迭代的时候 它会返回一个值和一个迭代器对象 这个迭代器对象可以生成元素值全部等于上面那个值的组中所有对象
  • 【深度学习】经典的卷积神经网络模型介绍(LeNet、AlexNet、VGGNet、GoogLeNet、ResNet和MobileNet)

    经典的卷积神经网络模型介绍 卷积神经网络简介 一 LeNet 1 INPUT层 输入层 2 C1层 卷积层 3 S2层 池化层 下采样层 4 C3层 卷积层 5 S4层 池化层 下采样层 6 C5层 卷积层 7 F6层 全连接层 二 Ale
  • 灰色预测模型matlab_灰色预测

    你好 我是goldsunC让我们一起进步吧 文章目录 灰色预测引言灰色预测的类型最简单的模型 GM 1 1 GM 1 1 模型实例原理及求解数据处理方法 1 累加生成2 累减生成3 均值生成求解步骤框图求解步骤小误差概率p及方差比检验标准
  • 企业管理靠员工自觉只能是海市蜃楼

    企业管理靠员工自觉只能是海市蜃楼 凭良心做事好不好 好 要不要凭良心做事 要 但得有前提 这个前提就是这家企业人人讲良心 个个讲良心 特别是老板讲良心 如果老板让员工讲良心 自己不讲良心 讲良心的人不是伤心走了 就是有样学样 也不讲良心了
  • C++进阶 智能指针

    本篇博客简介 介绍C 中的智能指针 智能指针 为什么会存在智能指针 内存泄露 内存泄漏定义 内存泄漏的危害 如何检测内存泄漏 如何避免内存泄漏 智能指针的使用及其原理 RAII 设计一个智能指针 C 官方的智能指针 定制删除器 智能指针总结
  • Java之Graphics2D图片生成水印

    目录 一 介绍 二 效果图 三 代码 四 优化方向 五 参考链接 一 介绍 百度百科 Graphics2D Graphics 类 提供了对几何形状 坐标转换 颜色管理和文本布局更为复杂的控制 不止通过JDK提供的工具类 还可以使用第三方的T
  • SQL Server通过链接服务器访问Oracle

    Windows SQL Server 2016 数据库通过链接服务器访问Oracle数据库 借鉴了很多大佬的文章 但是由于外链失效 文章久远 安装包版本太低 自己积分清零等多重原因 导致了很多问题 最后总算磕磕盼盼搞定了 整理一下流程 包括
  • ggplot2学习之3——aes函数

    文章目录 说明 函数名及参数 1 基本用法 2 函数的进一步封装 说明 R语言的版本为4 0 2 IDE为Rstudio 版本为1 3 959 学习的主要内容是R官方文档当中给出的算法 对其中的英文注释做了自己理解基础上的翻译 函数名及参数
  • Spring Boot 中的 @CachePut 注解是什么,原理,如何使用

    Spring Boot 中的 CachePut 注解是什么 原理 如何使用 简介 在 Spring Boot 中 CachePut 注解是用于缓存的注解之一 用于更新缓存中的数据 相比于 Cacheable 注解 CachePut 注解可以
  • 指针和数组笔试题

    目录 一维数组 字符数组 二维数组 指针笔试题 一维数组 数组和指针 数组 能够存放一组相同类型的元素 数组的大小取决于数组的元素个数和元素类型 指针 地址 指针变量 大小是4 8个字节 数组是数组 指针是指针 二者不等价 数组名是数组首元