【指针】看了这篇就会用*这个操作了

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、指针是什么:
  • 二、指针和指针类型:
  • 三.野指针
  • 四.指针运算:
  • 五.指针和数组:
  • 六. 二级指针:
  • 七. 指针数组:
  • 八. 数组指针:
  • 九. 一维数组传参:
  • 十. 二维数组传参:
  • 十一.一级指针传参:
  • 十二. 二级指针传参:


前言

我们可以通过&(取地址操作符)取出变量的内存其实地址,把地址可以存放到一个变量中,这个变量就是指针变量
提出一个问题:我们都知道,变量有不同的类型,整形,浮点型等。那指针有没有类型呢?
准确的说:有的

int num = 10;
p = #
char *pc = NULL;
int *pi = NULL;
short *ps = NULL;
long *pl = NULL;
float *pf = NULL;
double *pd = NULL;

提示:以下是本篇文章正文内容,下面案例可供参考

一、指针是什么:

指针是一种变量,其值为内存地址。通过指针,程序可以直接访问内存中的数据。指针提供了对内存的灵活访问

#include <stdio.h>

int main() {
    int x = 15;  // 一个整数
    int* ptr = &x;  // 整数指针,存储 x 的地址
    printf("y = %d\n", ptr);
    printf("y = %d\n", *ptr);
    int y = *ptr;

    return 0;
}

【指针】看了这篇就会用*这个操作了_第1张图片
我是这样子理解的当如果是*ptr就是指向的值,ptr是地址
【指针】看了这篇就会用*这个操作了_第2张图片

这样子更好理解

二、指针和指针类型:

指针类型定义了指针所指向的数据类型。类型决定了指针的解引用方式

int x = 10;
int *ptr = &x;    // 整数指针
char c = 'A';
char *charPtr = &c; // 字符指针

三.野指针

野指针是未初始化或已释放的指针。使用野指针可能导致程序错误。初始化指针并确保它指向有效的内存区域是重要的。
举例子:

int *wildPtr;      // 未初始化的指针
int *releasedPtr = malloc(sizeof(int));
free(releasedPtr); // 已释放的指针

四.指针运算:

指针运算包括指针加法、减法和比较。这些运算用于访问内存中的不同位置。

int arr[] = {1, 2, 3, 4, 5};
int *ptr = arr;

printf("%d\n", *(ptr + 2)); // 输出 arr[2] 的值

五.指针和数组:

指针与数组密切相关,数组名可以视为指向数组第一个元素的指针。

int arr[] = {1, 2, 3};
int *ptr = arr;

printf("%d\n", *ptr); // 输出 arr[0] 的值

六. 二级指针:

二级指针是指向指针的指针,用于操作指针的指针。

int x = 10;
int *ptr = &x;
int **doublePtr = &ptr;

printf("%d\n", **doublePtr); // 输出 x 的值

七. 指针数组:

指针数组是一个数组,其元素都是指针。可以用于存储字符串等数据。

char *names[] = {"Alice", "Bob", "Charlie"};
printf("%s\n", names[1]); // 输出 "Bob"

八. 数组指针:

数组指针是指向数组的指针,可以用于遍历数组。

int arr[] = {1, 2, 3};
int (*arrPtr)[3] = &arr;

printf("%d\n", (*arrPtr)[1]); // 输出 arr[1] 的值

提个问题

#include <stdio.h>
int main()
{
int arr[10] = {0};
printf("%p\n", arr);
printf("%p\n", &arr);
return 0;
}

【指针】看了这篇就会用*这个操作了_第3张图片

所以他们一样吗?

#include <stdio.h>
int main()
{
int arr[10] = { 0 };
printf("arr = %p\n", arr);
printf("&arr= %p\n", &arr);
printf("arr+1 = %p\n", arr+1);
printf("&arr+1= %p\n", &arr+1);
return 0;
}

输出结果
【指针】看了这篇就会用*这个操作了_第4张图片
根据上面的代码我们发现,其实&arr和arr,虽然值是一样的,但是意义应该不一样的。
实际上: &arr 表示的是数组的地址,而不是数组首元素的地址。

本例中 &arr 的类型是: int(*)[10] ,是一种数组指针类型
数组的地址+1,跳过整个数组的大小,所以 &arr+1 相对于 &arr 的差值是40

九. 一维数组传参:

数组作为函数参数时,其实传递的是数组的地址,可以通过指针访问数组

void printArray(int *arr, int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
}

int main() {
    int arr[] = {1, 2, 3};
    printArray(arr, 3);
    return 0;
}

十. 二维数组传参:

void printMatrix(int (*matrix)[3], int rows, int cols) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
}

int main() {
    int matrix[][3] = {{1, 2, 3}, {4, 5, 6}};
    printMatrix(matrix, 2, 3);
    return 0;
}

int (*matrix)[3] 是一个指向包含3个整数的数组的指针。

十一.一级指针传参:

级指针作为函数参数,可以用于修改调用者传递的变量。

void updateValue(int *x) {
    *x = *x + 1;
}

int main() {
    int value = 10;
    updateValue(&value);
    printf("%d\n", value); // 输出 11
    return 0;
}

十二. 二级指针传参:

二级指针传递地址,允许在函数内修改指针指向的值。

void updatePointer(int **ptr) {
    int newValue = 20;
    *ptr = &newValue;
}

int main() {
    int value = 10;
    int *ptr = &value;

    updatePointer(&ptr);

    printf("%d\n", *ptr); // 输出 20
    return 0;
}

你可能感兴趣的:(C/CPP,c++)