学C的第十八天【指针初阶:5. 指针和数组、6. 二级指针、7. 指针数组;初识结构体:1. 结构体的声明、2. 结构体成员的访问、3. 结构体传参;练习:3道和整数二进制数相关的练习】-1

简介: 5. 指针和数组 指针:指针变量就是指针变量,不是数组,指针变量的大小是 4/8 个字节,是专门用来存放地址的。

5. 指针和数组

               

指针:

指针变量就是指针变量,不是数组,指针变量的大小是 4/8 个字节,是专门用来存放地址的。

数组:

数组就是数组,不是指针,数组是一块连续的空间,可以存放1个或者多个类型相同的数据

数组的类型多种多样int arr[10] int arr[8] 数组类型就是不一样的,

前者的数组类型是 int [10] , 后者的数组类型是 int [8]

指针和数组的联系:

             

1. 数组中,数组名其实是数组首元素的地址数组名  ==  地址  ==  指针    

2. 当我们知道数组首元素的地址的时候,因为数组又是连续存放的,所以通过这个特性就可以遍历访问数组数组是可以通过指针来访问的。

回顾:(两种数组名不是首元素地址的情况)

           

1. sizeof(数组名)数组名单独放在sizeof()内部,这里的数组名表示整个数组计算的是整个数组的大小

             

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

                 

               

(演示代码:)

#include <stdio.h>
int main()
{
  int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
  int i = 0;
  int sz = sizeof(arr) / sizeof(arr[0]);
  int* p = arr; //使用指针变量存放数组首元素地址
  for ( i = 0; i < sz; i++)
  {
    //打印数组地址
    printf("%p == %p\n", p+i, &arr[i]);
    // 使用指针变量 访问数组地址 == 使用数组下标 访问数组地址
  }
  printf("\n");
  for ( i = 0; i < sz; i++)
  {
    printf("%d ", *(p + i));
    //使用指针访问 数组元素(指针和数组的联系)
  }
  return 0;
}


b80f2d127d0042e8bb42b2d7f7103332.png

6. 二级指针

                 

概念:

               

二级指针变量就是用来存放一级指针变量指针变量(例如下图中的pp)

(解引用:二级指针解引用找到一级指针,再对一级指针解引用找到变量内容


 (演示代码:)

#include <stdio.h>
int main()
{
  int a = 10;
  int* p = &a; 
  //p是一级指针变量,指针变量也是变量,变量是在内存中开辟空间的,是变量就有地址
  int** pp = &p;
  //pp就是二级指针变量,二级指针变量就是用来存放一级指针变量的指针变量
  *(*pp) = 100; 
  //(*pp):解引用找到p,对p再解引用找到 a
  //二级指针解引用找到一级指针,一级指针解引用找到变量内容
  printf("%d\n", a);
  return 0;
}

b3bf9b02174d494987f9d73d68918776.png

二级指针的应用:

         

(演示代码:涉及到指针数组

//二级指针引用:
#include <stdio.h>
int main()
{
  char arr1[] = "abcdef";
  char arr2[] = "hello world";
  char arr3[] = "cuihua";
  //使用 一级指针 存放这三个字符数组的首元素
  char* parr[] = { arr1,arr2,arr3 }; //分别存放三个字符数组的首元素地址
  //使用 二级指针 存放该一级指针
  char** p = parr; //放的是一级指针的首元素地址
  return 0;
}

image.png

7. 指针数组

           

概念:

                     

指针数组 就是 存放指针 数组(本质就是一个数组,只不过存放的是指针)


(演示代码:指针数组存放字符串数组并打印

//指针数组的应用:
#include <stdio.h>
int main()
{
  char arr1[] = "abcdef";
  char arr2[] = "hello world";
  char arr3[] = "cuihua";
  //使用 指针数组 存放这三个字符数组的首元素
  char* parr[] = { arr1,arr2,arr3 }; //分别存放三个字符数组的首元素地址
  //使用 指针数组 循环打印三个首地址,再通过首地址打印三个字符串
  int i = 0;
  for (i = 0; i < 3; i++)
  {
    printf("%s\n", parr[i]);
    // %s:通过字符串首元素地址就可以打印字符串,通过元素地址找到字符串
  }
  return 0;
}

image.png

(演示代码:指针数组存放整型数组并打印

//指针数组的应用:
#include <stdio.h>
int main()
{
  int arr1[] = { 1,2,3,4,5 };
  int arr2[] = { 2,3,4,5,6 };
  int arr3[] = { 3,4,5,6,7 };
  //使用 指针数组 存放这三个整型数组的首元素
  int* parr[] = { arr1, arr2, arr3 }; //分别存放三个整型数组的首元素地址
  //使用 指针数组 循环打印三个首地址,再通过首地址打印三个整型数组
  int i = 0;
  for (i = 0; i < 3; i++) //指针数组大小为3
  {
    //第一个循环:找到指针数组的元素
    int j = 0;
    for (j = 0; j < 5; j++) //整型数组大小为5
    {
      //第二个循环:找到对应数组元素地址后,再通过该地址打印整型数组内容
      printf("%d ", parr[i][j]);
      //也可以写成 *(parr[i] + j)
      //第一个【】:找到指针数组里的指针,定位到对应整型数组
      //第二个【】:定位到对应整型数组后,再用指针访问整型数组元素
    }
    printf("\n"); //打印完一个数组后换行
  }
  return 0;
}

image.png

总结:

                       

1. 调用指针数组访问里面元素,即指针,找到指针对应的整型数组,其用法类似二维数组的使用方式,即 指针数组名[下标][下标] ,如上图的:parr [i] [j]

2. 指针数组调用整型数组时,用法和二维数组的使用方式类似。但两者有区别前者数组元素在内存中是不连续存放,而后者的数组元素在内存中是连续存放。原因是:指针数组存放的元素,即指针,来自于不同的整型数组的地址

相关文章
|
1月前
使用指针访问数组元素
【10月更文挑战第30天】使用指针访问数组元素。
38 3
|
1月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
120 13
|
27天前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
1月前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
1月前
|
容器
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
|
1月前
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
|
1月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
56 4
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
105 4
|
1月前
使用指针访问数组元素
【10月更文挑战第31天】使用指针访问数组元素。
48 2
|
1月前
|
算法 索引
单链表题+数组题(快慢指针和左右指针)
单链表题+数组题(快慢指针和左右指针)
39 1