对各种指针,数组的联立回顾复习(字符指针,指针数组,数组指针,函数指针,函数指针数组)

简介: 对各种指针,数组的联立回顾复习(字符指针,指针数组,数组指针,函数指针,函数指针数组)

字符指针!指针数组!!数组指针!!!函数指针!!!!函数指针数组!!!!!总结性回顾!


1.首先来简单回顾一下字符指针!


int main()
{
  //char * 类型
  char ch = 'w';
  char* pc = &ch;
  char* ps = "abcdef";
  //准确的写法为:
  const  char* ps = "abcdef";
}

对于字符 char类型,因此,字符指针为:char * 类型!


对于:char* ps = "abcdef";   准确的写法为:    const  char* ps = "abcdef";  const修饰指针,放在*左边,限制的为:*ps; 表示ps所指向的对象*ps不能被修改!!而对于:"abcdef"是一个字符串,该"abcdef"字符串的值为:a的地址,存放在指针变量里面(char *);


下面请看笔者的完整代码:


#include <stdio.h>
int main()
{
  //char * 类型
  char ch = 'w';
  char* pc = &ch;
  //char* ps = "abcdef";
  //准确的写法为:
  const  char* ps = "abcdef";
  printf("%s\n", ps);
  printf("%c\n", *ps);  //这个是对字符串的值是a的地址的最好证明!
  return 0;
}

代码的运行结构为:


0a2653c851af460fa595bd959398a8f1.png


思考一下:字符指针的训练:


int main()
{
    char str1[] = "abcdef";
    char str2[] = "abcdef";
    const char* str3 = "abcdef";
    const char* str4 = "abcdef";
    if (str1 == str2)
        printf("str1 == str2\n");
    else
        printf("str1 != str2\n");
    if (str3 == str4)
        printf("str3 == str4\n");
    else
        printf("str3 != str4\n");
    return 0;
}


请大家思考一下!!然后自行在vs里面寻找答案!在此,笔者就不做更多的讲解!


2.笔者来带领大家简单回顾一下 :指针数组!


    概念:指针数组本质上是数组,存放指针的数组;


📌 注意:不要和数组指针混淆,数组指针本质上是指针;


对于指针数组,到目前为止:想必读者的第一想法,一定将是:存放数组的指针!!



对于指针,我们有着:

char *
int *
char **

对于上述的指针,读者也能自己想起来!!相信读者实力强强!!


请看笔者的简单使用:


int main()
{
  char* arr[4];
  //存放字符型指针的数组
  int* arr2[8];
  //存放整型指针的数组
  return 0;
}

分析下面的数组:


int arr1[5];
char arr2[6];
int* arr3[5];

🔑 解析:


    ① arr1 是一个整型数组,有 5 个元素,每个元素都是一个 整型;


    ② arr2 是一个字符数组,有 6 个元素,每个元素都是一个 char 型;


    ③ arr3 是一个整型指针数组,有 5 个元素,每个元素是一个 整型指针;


2d65d23f6d4748949b924e4057485923.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* p[] = { arr1, arr2, arr3 }; // 首元素地址
    int i = 0;
    for(i=0; i<3; i++) {
        int j = 0;
        for(j=0; j<5; j++) {
            printf("%d ", *(p[i] + j)); // j-> 首元素+0,首元素+1,+2...
            // == p[i][j] 
        }
        printf("\n");
    }
    return 0;
}


6de278e6d6694ce5bb08e7e842b7e74b.png


代码的运行结果为:


12c3b7f3f8814309a195c64f051d4445.png


3.数组指针的简单回顾!


int main()
{
    int a = 10;
    int* pa = &a;
    char ch = 'w';
    char* pc = &ch;
    int arr[10] = {1,2,3,4,5};
    int (*parr)[10] = &arr; // 取出的是数组的地址
    // parr 就是一个数组指针
    return 0;
}

数组指针的用法:一般在二维数组中使用较多!


void print1 (
    int arr[3][5], 
    int row, 
    int col
    )
{
    int i = 0;
    int j = 0;
    for(i=0; i<row; i++) {
        for(j=0; j<col; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
}
void print2 (
    int(*p)[5], // 数组指针,指向二维数组的某一行
    int row, 
    int col
    )
{
    int i = 0;
    int j = 0;
    for(i=0; i<row; i++) {
        for(j=0; j<col; j++) {
            printf("%d ", *(*(p + i) + j));
            // printf("%d ", (*(p + i))[j]);
            // printf("%d ", *(p[i] + j));
            // printf("%d ", p[i][j]);
        }
        printf("\n");
    }
}
int main()
{
    int arr[3][5] = {{1,2,3,4,5}, {2,3,4,5,6}, {3,4,5,6,7}};
    // print1(arr, 3, 5);
    print2(arr, 3, 5); // arr数组名,表示元素首元素的地址
    return 0;
}


对于代码的运行结果也是显而易见的:


34e8d716411043c08c7ffba9fbba23de.png


4.函数指针的简单讲解!


用一个代码来进行思考一下!


int add(int x, int y)
{
  return x + y;
}
int main()
{
  //pf就是函数指针变量!
  int (*pf)(int, int) = add;
  printf("%d\n", (*pf)(3, 5));
  return 0;
}

代码的运行结果为:


92ba0822ed0b46e1ae72df8a17d3a45b.png


5函数指针数组详解:


如果要把函数的地址存到一个数组中,那这个数组就叫 函数指针数组



💬 函数指针数组的定义:


int Add(int x, int y) {
    return x + y;
}
int Sub(int x, int y) {
    return x - y;
}
int main()
{
    int (*pf)(int, int) = Add;
    int (*pf2)(int, int) = Sub;
    int (*pfArr[2])(int, int) = {Add, Sub};
//         👆 pfArr 就是函数指针数组
    return 0;
}


函数指针数组的应用!笔者在之前用简单实现计算器来进行讲解过!有意者,请参考之前代码!




相关文章
|
2天前
|
存储 C语言 C++
指针进阶(函数指针)(C语言)
指针进阶(函数指针)(C语言)
|
2天前
|
编译器 C语言
指针进阶(数组指针 )(C语言)
指针进阶(数组指针 )(C语言)
|
3天前
|
C语言
【C语言】:详解函数指针变量,函数指针数组及转移表
【C语言】:详解函数指针变量,函数指针数组及转移表
10 2
|
3天前
|
C语言
【C语言】:详解指针数组,数组指针及(二维)数组传参(2)
【C语言】:详解指针数组,数组指针及(二维)数组传参(2)
8 1
|
3天前
|
Serverless C语言
【C语言】:对(一维)数组与指针的深入理解(1)
【C语言】:对(一维)数组与指针的深入理解(1)
8 1
|
23小时前
|
C语言
C语言中的函数指针、指针函数与函数回调
C语言中的函数指针、指针函数与函数回调
5 0
|
23小时前
|
存储 C语言
C语言中的多级指针、指针数组与数组指针
C语言中的多级指针、指针数组与数组指针
5 0
|
23小时前
|
存储 C语言
C语言数组指针详解与应用
C语言数组指针详解与应用
8 0
|
6天前
|
C语言
C语言----关于二维数组传参的本质相关的知识点(数组指针、指针数组)
C语言----关于二维数组传参的本质相关的知识点(数组指针、指针数组)
|
2天前
|
C语言
指针进阶(C语言终)
指针进阶(C语言终)