【C】数组和指针练习

简介: 【C】数组和指针练习及其详解


🎈今日心语:一切知,俱于黎明中醒。


目录

一、数组笔试题解析

知识点:

1、一维数组题目

题目1:

2、字符数组题目

题目一:字符

题目二:字符串

题目三:指针变量

3、二维数组题目

二、指针笔试题

笔试题1:

笔试题2:

笔试题3:

笔试题4:

笔试题5:

笔试题6:

笔试题7:

笔试题8:

结语:




一、数组笔试题解析

知识点:

只要是地址就是4/8个字节

数组名

数组名是数组首元素的地址

但是有2个例外:

1. sizeof(数组名) - 数组名表示整个数组,计算的是整个数组的大小,单位是字节

2. &数组名 - 数组名也表示整个数组,取出的是整个数组的地址

除了这个2个例外,你见到的所有的数组名都表示首元素的地址

sizeof

sizeof 是计算对象或者类型创建的对象所占内存空间的大小,单位是字节

sizeof 是操作符,不是函数

strlen

strlen 求字符串长度的,计算的是字符串中\0之前出现的字符的个数

统计到\0为止,如果没有看到\0,会继续往后找

strlen 是库函数

1、一维数组题目

题目1:

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

image.gif

运行结果:image.gif

题目解析:image.gif


2、字符数组题目

题目一:字符

int main()
{
  //字符数组
  char arr[] = { 'a','b','c','d','e','f' };
  printf("%d\n", sizeof(arr));
  printf("%d\n", sizeof(arr + 0));
  printf("%d\n", sizeof(*arr));
  printf("%d\n", sizeof(arr[1]));
  printf("%d\n", sizeof(&arr));
  printf("%d\n", sizeof(&arr + 1));
  printf("%d\n", sizeof(&arr[0] + 1));
  printf("%d\n", strlen(arr));
  printf("%d\n", strlen(arr + 0));
  printf("%d\n", strlen(*arr));
  printf("%d\n", strlen(arr[1]));
  printf("%d\n", strlen(&arr));
  printf("%d\n", strlen(&arr + 1));
  printf("%d\n", strlen(&arr[0] + 1));
  return 0;
}

image.gif

这里的printf("%d\n", strlen(*arr)); printf("%d\n", strlen(arr[1]))在运行时会报错,所以下面的运行结果不包括这两个,具体原因见后文

运行结果:image.gif编辑 题目解析:image.gif编辑


题目二:字符串

此题目与上述题目类似,若上面的例子已完全掌握,此题将手到擒来

因此,这里只提供运行结果与必要的暗示

int main()
{
    char arr[] = "abcdef";
    printf("%d\n", sizeof(arr));
    printf("%d\n", sizeof(arr + 0));
    printf("%d\n", sizeof(*arr));
    printf("%d\n", sizeof(arr[1]));
    printf("%d\n", sizeof(&arr));
    printf("%d\n", sizeof(&arr + 1));
    printf("%d\n", sizeof(&arr[0] + 1));
    printf("%d\n", strlen(arr));
    printf("%d\n", strlen(arr + 0));
    printf("%d\n", strlen(*arr));
    printf("%d\n", strlen(arr[1]));
    printf("%d\n", strlen(&arr));
    printf("%d\n", strlen(&arr + 1));
    printf("%d\n", strlen(&arr[0] + 1));
    return 0;
}

image.gif

题目解析及运行结果:image.gif


题目三:指针变量

char *p = "abcdef";
printf("%d\n", sizeof(p));
printf("%d\n", sizeof(p+1));
printf("%d\n", sizeof(*p));
printf("%d\n", sizeof(p[0]));
printf("%d\n", sizeof(&p));
printf("%d\n", sizeof(&p+1));
printf("%d\n", sizeof(&p[0]+1));
printf("%d\n", strlen(p));
printf("%d\n", strlen(p+1));
printf("%d\n", strlen(*p));
printf("%d\n", strlen(p[0]));
printf("%d\n", strlen(&p));
printf("%d\n", strlen(&p+1));
printf("%d\n", strlen(&p[0]+1));

image.gif

题目解析及运行结果

image.gif编辑

image.gif


3、二维数组题目

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

image.gif

题目解析及运行结果:image.gif

image.gif编辑


二、指针笔试题

笔试题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;
}
//程序的结果是什么?

image.gif

image.gif


笔试题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;
}

image.gif

题目解析及运行结果:image.gif


笔试题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);
  //%p - 是打印地址
  //%x - 是16进制的格式打印
  return 0;
}

image.gif

题目解析及运行结果:

image.gif编辑


笔试题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;
}

image.gif

题目解析及运行结果:

image.gif


笔试题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;
}

image.gif

题目解析及运行结果:

image.gif编辑


笔试题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;
}

image.gif

题目解析及运行结果:image.gif


笔试题7:

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

image.gif

题目解析及运行结果:image.gif编辑


笔试题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;
}

image.gif

题目解析及运行结果:image.gif


结语:

这里我们关于指针笔试题的内容就介绍完了,如果小伙伴还有不理解的内容,可以参考之前关于指针进阶的博文。
文章中某些内容我们之前有介绍,所以只是一笔带过,还请谅解。
希望以上内容对大家有所帮助👀,如有不足望指出🙏

加油!!

相关文章
|
3天前
|
存储 C语言
字符指针变量与字符数组的比较
字符指针变量与字符数组的比较
14 3
|
3天前
|
存储 C语言
指针数组作为main函数的形参
指针数组作为main函数的形参
4 0
|
3天前
|
存储 C语言 索引
指向结构体数组的指针
指向结构体数组的指针
7 0
|
3天前
|
C语言
在引用数组元素时指针的运算
在引用数组元素时指针的运算
9 0
|
3天前
|
C语言
通过指针引用数组元素
通过指针引用数组元素
7 0
|
3天前
|
存储 C语言
数组元素的指针
数组元素的指针
6 0
|
3天前
|
存储 C语言
什么是指针数组
什么是指针数组
8 0
|
4天前
|
存储 编译器 C语言
数组指针,高效编程之道
数组指针,高效编程之道
|
4天前
|
存储 安全 编译器
C语言指针与数组
C语言指针与数组
10 0
|
4天前
|
存储 C语言
C语言中的指针数组与多重指针
C语言中的指针数组与多重指针
11 0