指针和字符数组笔试题及其解析(第二组)

简介: 指针和字符数组笔试题及其解析(第二组)

Lei宝啊 :个人主页

愿所有美好不期而遇



前言:

数组名在寻常情况下表示首元素地址,但有两种情况例外:

1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小

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

3.sizeof是操作符,不是函数,并且sizeof不计算括号里的表达式,他会在编译阶段检查括号里的表达式的类型属性,计算出大小。(任何表达式都有两种属性,值属性和类型属性,

int a = 3; short b = 2; b = a + b;这个表达式的值属性就是5,类型属性就是short)


第二组笔试题

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));

答案

7 8 1 1 8 8 8

6 6 error error 6 随机值 5

(博主用的是64位机器,所以地址占的空间大小为8字节,如果得4的话,是32位机器)

解析

  char arr[] = "abcdef";
  printf("%d\n", sizeof(arr));
  //sizeof(数组名),计算整个数组的大小,
  //字符串结尾还有\0占一个字节的空间,共7个字节
  printf("%d\n", sizeof(arr + 0));
  //类比arr+1,这里的arr代表数组首元素地址,所以4/8
  printf("%d\n", sizeof(*arr));
  //*arr访问的是char类型的数据,1个字节
  printf("%d\n", sizeof(arr[1]));
  //第二个元素,数据类型为char,1个字节
  printf("%d\n", sizeof(&arr));
  //&arr,指针类型为数组指针,此时取出的是整个数组的地址,
  //但归根结底还是指针,占4/8个字节
  printf("%d\n", sizeof(&arr + 1));
  //数组指针向后走一个指针的距离,4/8
  printf("%d\n", sizeof(&arr[0] + 1));
  //指向第二个元素,4/8
  //-------------------------------------------------------------------
  //-------------------------------------------------------------------
  //strlen是计算字符串长度的哦
  printf("%d\n", strlen(arr));
  //strlen遇到\0停止,所以得6
  printf("%d\n", strlen(arr + 0));
  //相同道理,6
  printf("%d\n", strlen(*arr));
  //error, *arr是'a',ASCII值为97,当做地址传入strlen,
  //成为野指针非法访问
  printf("%d\n", strlen(arr[1]));
  //error, 'b'也同理
  printf("%d\n", strlen(&arr));
  //&arr与arr地址相同,尽管其意义不同,
  //&arr指针类型为数组指针,会被转换成strlen接受的指针类型,
  //所以我们最终得到的还是6
  printf("%d\n", strlen(&arr + 1));
  //随机值,&arr+1跳过的是整个数组,所以我们无法判断何时会
  //再遇见\0,。
  printf("%d\n", strlen(&arr[0] + 1));
  //指向第二个元素,所以得到5

目录
相关文章
|
3天前
|
C++ 存储 Java
C++ 引用和指针:内存地址、创建方法及应用解析
'markdown'C++ 中的引用是现有变量的别名,用 `&` 创建。例如:`string &meal = food;`。指针通过 `&` 获取变量内存地址,用 `*` 创建。指针变量存储地址,如 `string *ptr = &food;`。引用不可为空且不可变,指针可为空且可变,适用于动态内存和复杂数据结构。两者在函数参数传递和效率提升方面各有优势。 ```
|
5天前
|
存储 搜索推荐 编译器
C语言数组深入解析与实战应用
C语言数组深入解析与实战应用
12 0
|
5天前
|
存储 算法 Java
Java数组与集合的深入解析
Java数组与集合的深入解析
23 0
|
5天前
|
C++
多重指针:深入解析、应用与示例
多重指针:深入解析、应用与示例
|
6天前
|
C++
野指针与空指针:深入解析与防范策略
野指针与空指针:深入解析与防范策略
|
6天前
|
存储 C语言
字符指针变量与字符数组的比较
字符指针变量与字符数组的比较
17 3
|
6天前
|
存储 C语言
指针数组作为main函数的形参
指针数组作为main函数的形参
4 0
|
6天前
|
存储 C语言 索引
指向结构体数组的指针
指向结构体数组的指针
11 0
|
5天前
|
C语言
C语言指针带代码
C语言指针带代码
18 3
|
7天前
|
C语言
C语言中返回指针值的函数
C语言中返回指针值的函数
18 0

推荐镜像

更多