C语言利用面试真题理解指针的使用

目录
  • 前言
  • 笔试题一
  • 笔试题二
  • 笔试题三
  • 笔试题四
  • 笔试题五
  • 笔试题六
  • 笔试题七
  • 笔试题八

前言

大家好~我又来了,今天给大家带来的是指针的几道笔试题,希望能够加强大家对指针知识的把握,指针就应该这样学!

笔试题一

#include<stdio.h>
int main()
{
	int a[5] = { 1 , 2 , 3 , 4 , 5 };
	int* ptr = (int*) (&a + 1);
	printf("%d, %d", *(a + 1), *(ptr - 1));
	return 0;
}

1.&a取出的是整个数组的地址,&a+1是跳过一个类型为int(* )[5]的数组。

2.a不是单独放在sizeof内,并且数组名a前面没有取地址符号,此时a表示首元素的地址。a+1时跳过一个类型为int的整型,即为第二位元素地址。

3.ptr-1是跳过一个类型为int的整型。

4.( * )(a+1)–>a[1];*(ptr-1)–>ptr[-1]。

笔试题二

#include<stdio.h>
//结构体大小是20个字节
struct Test
{
	int Num;
	char* pcName;
	 short sDate;
	char cha[2];
	short sBa[4];
}*p;
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节
//x86环境下
int main()
{
	printf("%p\n", p + 0x1);
	//0x100000+20-->0x100014
	//p+1表示跳过一个结构体,一个结构体的大小为20个字节
	printf("%p\n", (unsigned long) p + 0x1);
	//0x100000+1-->0x100001
	//将p强制转换成一个整型之后加1
	printf("%p\n", (unsigned int*) p + 0x1);
	//0x100000+4-->0x100004
	//p+1表示跳过一个类型为unsigned int的整型,即四个字节
	return 0;
}

笔试题三

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

1.ptr[-1]相当于 * (ptr-1)

2.&a取出的是整个数组的地址,&a+1是跳过一个类型为int(*)[4]的数组。

3.a不是单独放在sizeof内,并且数组名a前面没有取地址符号,此时a表示首元素的地址。a进行了强制类型转化成int,a+1进行整型之间相加,再进行强制转化成指针,跳过了一个字节,一个int类型大小为4个字节,而数据进行的是小端存储,故由指向01的指针,指向了00。而prt2的访问权限是访问4个字节,故ptr2访问的是0x02000000。

笔试题四

#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 ;
}

因为int a[3][2] = {(0,1),(2,3),(4,5)}是逗号表达式。

逗号表达式,就是用逗号隔开的多个表达式。

逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。

故int a[3][2] ={1,3,5};

a[0]是第一行的数组名,a[0]表示首元素的地址,即a[0][0]的地址,&a[0][0].

笔试题五

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

1.p[4][2]相当于*(*(p+4)+2)。

2.两指针相减,得到的是两个指针之间的元素个数。

3.%p直接打印的是补码,地址被认为是无符号整型。

笔试题六

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

1.* (aa+1)相当于aa[1],表示第二行的数组名。

2.&aa取出的是整个数组的地址,&aa+1是跳过一个类型为int(*)[2][5]的数组。

3.aa不是单独放在sizeof内,并且数组名aa前面没有取地址符号,此时aa表示第一行的数组名,aa+1表示第二行的数组名。

笔试题七

#include<stdio.h>
int main()
{
	char* a[] = { "work" , "at" , "alibaba" };
	char** pa = a;
	pa++;
	printf("%s\n", *pa);
	return 0;
}

pa++是跳过一个类型为char*的指针。

笔试题八

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

1.*cpp[-2]相当于 * ( * (cpp-2))。

2.cpp[-1][-1]相当于 * ( * (cpp-1)-1)

到此这篇关于C语言利用面试真题理解指针的使用的文章就介绍到这了,更多相关C语言指针内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言sizeof和strlen的指针和数组面试题详解

    目录 一.概念 sizeof: strlen: 二.例题及解析 2.1 一维数组 2.2 字符数组 2.3 二维数组 三.总结 一.概念 sizeof: sizeof操作符的结果类型为size_t,(它在头文件用typedfe定义为unsigned int类型),计算的是分配空间的实际字节数.sizeof是运算符,可以以类型.函数.做参数 . strlen: strlen结果类型也为size_t(size_t strlen( const char *string )),但strlen是计算的空间

  • C语言学习之指针知识总结

    目录 一.地址 二.指针与指针变量 三.指针的作用 四.初学指针时常见的错误 五.通过调用函数修改主调函数中的值 六.指针与一维数组 七.使用函数操作一维数组 八.指针变量所占字节数 九.静态数组的缺陷 十.malloc函数 十一.动态数组的构造 十二.静态内存与动态内存的对比 十三.多级指针 十四.跨函数使用内存 一.地址 内存中的最小单元是字节,一个字节对应一个编号,这里的编号就是对应字节的地址.换句话说,地址就是内存单元的编号. 二.指针与指针变量 指针与指针变量是两个不同的概念,指针是某

  • C语言深入浅出分析函数指针

    目录 我们先看一个代码: #include<stdio.h> void test() { printf("haha\n"); } int main() { printf("%p\n", test); printf("%p\n", &test); return 0; } 输出的是两个地址,函数名就是函数的地址 将函数的地址存起来: #include<stdio.h> void test() { printf(&quo

  • C语言超详细讲解指向函数的指针

    目录 一.函数的指针 二.指向函数的指针变量 三.调用函数的两种方式 四.指向函数的指针的作用 五.用指向函数的指针作函数参数(重点) 六.为什么要将指向函数的指针变量作为函数的形参(重点) 一.函数的指针 首先,函数名代表函数的起始地址,调用函数时,程序会从函数名获取到函数起始地址,并从该地址起执行函数中的代码,函数名就是函数的指针,所以我们可以定义一个指向函数的指针变量,用来存放函数的起始地址,这样一来,就可以通过该变量来调用其所指向的函数. 二.指向函数的指针变量 定义指向函数的指针变量

  • C语言简析指针用途

    目录 对象的访问方式 什么是指针 指针变量 与指针相关的运算符 指针变量作为函数参数 数组与指针 多维数组与指针 指针常量 和 常量指针 指针数组 与 数组指针 字符串与指针 函数指针 二级指针 与 多级指针 在C语言中,任何一个变量,都有两层含义: (1) 代表该变量的存储单元的地址:变量的地址 左值 lvalue (2) 代表该变量的值:右值 rvalue 对于一个变量的访问,只有两种情况: 一是把一个值写到变量的地址中去 (lvalue) 二是从变量的地址中取变量的值 (rvalue) 对

  • C语言例题讲解指针与数组

    目录 1.概要复习 2.指针与数组笔试题 2.1一维数组 2.2字符数组 2.3字符串数组 2.4字符串指针 2.5二维数组 1.概要复习 本篇的内容主要围绕指针与数组.指针与字符串等之间的关系,以及进一步理解sizeof .strlen 的使用与意义. 数组是指具有相同类型元素的集合,字符串常量是一个指向在连续空间里存放的字符的首字符的地址的指针.我们会在下面理解数组与字符串数组的不同. sizeof 是一个操作符,是计算类型空间大小的.strlen 是针对字符串的库函数,用来求字符串的长度.

  • C语言指针如何实现字符串逆序反转

    目录 指针实现字符串逆序反转 知识点 字符串逆序的几种写法 非递归写法 递归写法 指针实现字符串逆序反转 #include<stdio.h> #include<string.h> void rec(char* arr) { //int len = sizeof(arr); // 判断字符串长度需要用strlen. int len = strlen(arr); printf("字符串长度len = %d\n", len); char* p1 = arr; char

  • C语言八道笔试题精讲带你掌握指针

    目录 题目一 题目二 题目三 题目四 题目五 题目六 题目七 题目八 为了题目的准确性和我们一般学习过程中的习惯,这里所有的题目代码都是在 X86 环境(32 位平台)下运行的. 题目一 #include <stdio.h> int main() { int a[5] = { 1, 2, 3, 4, 5 }; int* ptr = (int*)(&a + 1); printf("%d,%d", *(a + 1), *(ptr - 1)); return 0; } /

  • C语言利用面试真题理解指针的使用

    目录 前言 笔试题一 笔试题二 笔试题三 笔试题四 笔试题五 笔试题六 笔试题七 笔试题八 前言 大家好~我又来了,今天给大家带来的是指针的几道笔试题,希望能够加强大家对指针知识的把握,指针就应该这样学! 笔试题一 #include<stdio.h> int main() { int a[5] = { 1 , 2 , 3 , 4 , 5 }; int* ptr = (int*) (&a + 1); printf("%d, %d", *(a + 1), *(ptr -

  • Go语言切片常考的面试真题解析

    目录 前言 01. 数组和切片有什么区别? 02. 拷贝大切片一定比拷贝小切片代价大吗? 03. 切片的深浅拷贝 04. 零切片.空切片.nil切片是什么 05. 切片的扩容策略 07. 参数传递切片和切片指针有什么区别? 08. range遍历切片有什么要注意的? 总结 前言 哈喽,大家好,我是asong.最近没事在看八股文,总结了几道常考的切片八股文,以问答的方式总结出来,希望对正在面试的你们有用- 本文题目不全,关于切片的面试真题还有哪些?欢迎评论区补充- 01. 数组和切片有什么区别?

  • C语言单值二叉树真题讲解

    目录 一.题目描述 二.解题思路 [OJ - 二叉树]单值二叉树 LeetCode链接:单值二叉树 题目难度:简单 一.题目描述 如果二叉树每个节点都具有相同的值,那么该二叉树就是 单值 二叉树. 只有给定的树是单值二叉树时,才返回 true:否则返回 false. 二.解题思路 二叉树的递归遍历,一般都会把问题拆分成 当前树(根节点) 和 子树,然后子树又进行拆分,来解决问题. 核心思路: 1.先判断当前节点是否为空,如果为空,返回 true(空树也满足单值二叉树的条件) 2.判断当前树是不是

  • C语言修炼之路函数篇真题训练下

      本文的Gitee地址:文章源代码 第壹题 :字符串逆序(递归实现) 方法一,非递归实现 main主体部分 数组名是首元素的地址 首元素是char类型,对应的传参元素过去就是  char*  类型 采用两个指针不断移动,然后交换两个位置的元素来实现逆序 方法贰,递归实现 大致思路 代码实现 (推荐自己手动模拟一下) void reverse_string(char* str) { int len = strlen(str); char tmp = str[0]; str[0] = str[le

  • C语言修炼之路函数篇真题训练上

    本文对应文章 : C语言修炼之路一朝函数思习得 模块思维世间生上篇 C语言修炼之路一朝函数思习得 模块思维世间生下篇 第壹题 A选项 C语言的函数每次只能返回一个元素,上面代码中的 return a,b 只能执行逗号表达式的最后一个语句,即返回20 B选项 C选项 D选项 全局变量在整个程序的任意地方都可以使用 第贰题 C选项 函数不可嵌套定义,但可以嵌套调用  --  “上一篇文章中提及过” 第叁题 A选项 可以 return void 不返回任何参数 B选项 正确 C选项 可以使用全局变量

  • C语言 从根本上理解指针

    目录 一.* 的意义 二.传值调用与传址调用 三.常量与指针 四.小结 一.* 的意义 在指针声明时,* 号表示所声明的变量为指针 在指针使用时,* 号表示取指针所指向的内存空间中的值 如下: int i = 0; int j = 0; int* p = &i; //指针声明 j = *p; //取值 变量 p 保存着变量 i 的内存地址,即:p <--> &i *p <--> i * 号类似一把钥匙,通过这把钥匙可以打开内存,读取内存中的值. 下面看一个指针的使用

  • C语言:利用指针编写程序,用梯形法计算给定的定积分实例

    题目要求 利用指针编写程序,用梯形法计算下列公式中的定积分: 参考代码 首先说明一下指针的用处:因为所传递的参数均为数字,并不需要使用指针提高效率,故这里使用指针指向函数. 请注意calc()函数中的这一语句: double(*pfunction)() = &function; 即实现了我所描述的过程. 代码如下: #include <stdio.h> #include <math.h> double function(double x){ return (double)(

  • 深入理解C语言中使用频率较高的指针与数组

    目录 定义 指针与二维数组 指针数组与数组指针 数组指针的应用 操作 总结 定义 指针:C语言中某种数据类型的数据存储的内存地址,例如:指向各种整型的指针或者指向某个结构体的指针. 数组:若干个相同C语言数据类型的元素在连续内存中储存的一种形态. 数组在编译时就已经被确定下来,而指针直到运行时才能被真正的确定到底指向何方.所以数组的这些身份(内存)一旦确定下来就不能轻易的改变了,它们(内存)会伴随数组一生. 而指针则有很多的选择,在其一生他可以选择不同的生活方式,比如一个字符指针可以指向单个字符

  • C语言经典顺序表真题演练讲解

    目录 1.移除元素 2.删除有序数组中的重复项 3.合并两个有序数组 1.移除元素 链接直达: https://leetcode-cn.com/problems/remove-element/ 题目: 思路: 法一:依次挪动数据进行覆盖 从第一个数据开始进行依次遍历,如同示例1,依次遍历数组,找到移除的元素2就把后面的数据往前挪动进行覆盖,如图所示: 此法有个缺陷,题目中明确指出使用空间复杂度O(1)的方法解决此问题,而此法的空间复杂度刚好为O(1),可以解决,不过考虑周全些,时间复杂度在情况最

  • C语言平衡二叉树真题练习

    目录 一.题目描述 二.解题思路 自顶向下的递归(暴力解法) 自底向上的递归(最优解法) 题目难度:简单 LeetCode链接:平衡二叉树 一.题目描述 给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高度平衡二叉树定义为:一个二叉树 每个节点 的左右两个子树的高度差的绝对值不超过 1 . 二.解题思路 一棵二叉树是平衡二叉树,当且仅当其所有子树也都是平衡二叉树,因此我们使用递归的方式依次判断其所有子树是否为平衡二叉树,就知道这棵二叉树是不是平衡二叉树了. 自顶向下的递归(暴力解法)

随机推荐