指针和数组试题解析(1)一维数组部分

简介: 指针和数组试题解析(1)一维数组部分

既然我们已经提到了数组,想必对于数组名的应用场景,想必大家也是深记于心吧!但是在此,笔者仍要忍不住的提一下:对于数组名的使用!


数组名是数组首元素的地址,但是有两个列外!


1.sizeof(数组名): 在这里面,数组名表示整个数组,计算的是整个数组的大小!单位为字节!


2.&数组名(取地址操作):在这里面,数组名也表示整个数组,取出的是整个数组的地址!


除了这两个列外,其余所见到的数组名都表示首元素的地址!!!


下面进入笔者的指针和数组试题解析部分!


在一维数组中举列为:


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


注意,笔者的代码是在vs2022 的x86环境下进行演示的!请注意细节,若是在vs2022的x64环境下,将会出现不一样的结果!但那个结果也是正确的!


0a2653c851af460fa595bd959398a8f1.png


若是有老铁能直接看懂,并且能够跟答案对上号,那么这篇博客,这位老铁就没有看的必要了,下面内容主要是对上面的代码的讲解!并不做其他的内容!但若是有兴趣,可以进一步欣赏!


对于数组:    int a[] = { 1,2,3,4 };


1.sizeof(a) :a作为数组名,单独放在sizeof()内部,所以,计算的是整个数组的大小,单位为字节!16


2.sizeof(a+0)  : 数组名a并非单独放在sizeof()内部,也没有进行&数组名(取地址)操作,所以在这里,数组名指的是数组的首元素大小!单位为字节!4/8


3.sizeof(*a)  : a是数组的首元素的地址,*a就是得到了首元素,sizeof(*a) 计算的就是首元素的大小!单位为字节!4/8


4.sizeof(a+1)  : a是数组首元素的地址,a+1是第二个元素的地址,则sizeof(a+1) 计算的是地址(指针)的大小!单位为字节!4/8


5.sizeof(a[1])  :a[1] 就是数组的第二个元素,sizeof(a[1]) 的大小为4/8个字节!


6.sizeof(&a)  : &a 取出的是整个数组的地址,但是,数组的地址也是个地址,所以,也是4/8个字节!


   扩展一下:对于数组地址与首元素地址的区别,请详见文章最后头!!


7.sizeof(*&a)  : &a是得到数组的地址,是数组指针类型,而*&a是对数组指针进行解引用,访问一个数组的大小! 单位为字节!16


  因此,我们可以推出:  sizeof(*&a)相当于:sizeof(a);


8.sizeof(&a+1)  : &a是取出数组的地址,&a+1相当于跳过整个数组,但是,仍然是地址!所以一个地址的大小仍然为:4/8个字节!


2d65d23f6d4748949b924e4057485923.png


9.sizeof(&a[0])  : a[0]是数组的第一个元素,&a[0]得到的是第一个元素的地址!所以sizeof(&a[0])计算的还是地址(指针)的大小,单位是字节!4/8


10.sizeof(&a[0]+1)  : &a[0]得到的是第一个元素的地址,&a[0]+1 跳过一个元素,得到的就是第二个元素的地址,单位为字节,4/8!


使用了这么多的 sizeof() 想必大家对于sizeof()有着怀疑?sizeof是操作符,还是函数????


其实sizeof是操作符,不是函数!!


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


上述代码的运行结果为:重要的是理解的过程,而不是结果!!


6de278e6d6694ce5bb08e7e842b7e74b.png


下面笔者来对那个扩展:对于数组地址与首元素地址的区别  ,来进行简单的讲解一下!


数组地址与首元素地址的区别主要在:类型上!即:指针走一步跨过的步长!!


int a[] = { 1,2,3,4 }


a-->int* 类型!  &a-->int(*)[4]类型!


原因在于: int* p=a;   int (*pa)[4]=&a;


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

对于第一组:


printf("%p\n", p);
  printf("%p\n", p+1);

由p 到 p+1 跳过4个字节(一个整型的指针)


对于第二组


printf("%p\n", pa);
  printf("%p\n", pa+1);

由pa 到 pa+1 跳过16个字节,原因在于,定义的 pa[4]为一个整形的数组(16个字节)


代码的运行结果为:


12c3b7f3f8814309a195c64f051d4445.png


到此为止,笔者所精心钻研指针和数组试题解析(1)部分已经结束!期待着后续部分!!


相关文章
|
15天前
|
C语言
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)
|
21小时前
|
Java
解析java中的数组
解析java中的数组
8 3
|
9天前
|
存储 程序员 C语言
【C 言专栏】C 语言指针的深度解析
【4月更文挑战第30天】C 语言中的指针是程序设计的关键,它如同一把钥匙,提供直接内存操作的途径。指针是存储其他变量地址的变量,通过声明如`int *ptr`来使用。它们在动态内存分配、函数参数传递及数组操作中发挥重要作用。然而,误用指针可能导致错误,如空指针引用和内存泄漏。理解指针的运算、与数组和函数的关系,以及在结构体中的应用,是成为熟练 C 语言程序员的必经之路。虽然挑战重重,但掌握指针将增强编程效率和灵活性。不断实践和学习,我们将驾驭指针,探索更广阔的编程世界。
|
15天前
|
存储 C语言
指针深入解析(C语言基础)带你走进指针,了解指针
指针深入解析(C语言基础)带你走进指针,了解指针
|
15天前
指针指向数组
指针指向数组
17 0
|
15天前
|
C语言 C++
C语言:指针运算笔试题解析(包括令人费解的指针题目)
C语言:指针运算笔试题解析(包括令人费解的指针题目)
|
28天前
|
存储 程序员 编译器
爱上C语言:指针很难?来来来,看看这篇(基础篇)
爱上C语言:指针很难?来来来,看看这篇(基础篇)
|
17天前
|
安全 C语言
指针与字符串:C语言中的深入探索
指针与字符串:C语言中的深入探索
15 0
|
18天前
|
存储 监控 C语言
c语言的指针
c语言的指针
22 0
|
24天前
|
编译器 C语言 C++
初阶指针(C语言)
初阶指针(C语言)

推荐镜像

更多