大话C语言:第29篇 指针

1 指针概念

  • 指针:地址的变量化形式,其存储的是内存中某个存储单元的地址。它是地址的数值表示。

  • 指针变量:一种特殊的变量,它专门用于存放变量的地址(即指针)。

注意,指针和指针变量的区别:

  • 指针本身是一个地址,这个地址指向内存中的一个存储单元。它只是一个内存地址的抽象表示,没有存储空间来存储值,只是指向一个存储位置。

  • 指针变量则是一个变量,用于存储指针的值,即内存地址。指针变量有具体的存储空间,可以存储一个地址值。在程序中,可以通过操作指针变量来间接地访问和操作它所指向的内存地址中的数据。

2 指针变量的定义

语法格式:

类型 变量;
类型 * 指针变量 = &变量;

其中,

  • & 叫取地址,返回操作数的内存地

  • *叫解引用,指操作指针所指向的变量的值

  • 在定义变量时,* 号表示所声明的变量为指针类型。指针变量要保存某个变量的地址,指针变量的类型比这个变量的类型多一个*

  • 在指针使用时,* 号表示操作指针所指向的内存空间

注意,

  • 指针也是一种数据类型,指针变量也是一种变量

  • 指针变量指向谁,就把谁的地址赋值给指针变量

代码示例:

#include <stdio.h>

int main() 
{
    // 定义一个int类型的变量,同时赋值为10
    int a = 10;
    // 打印变量的地址
    printf("&a = %p\n", &a);
    // 定义一个指针变量,int *保存int的地址
    // int *代表是一种数据类型,int *指针类型,p才是变量名
    int* p;
    // 指针指向谁,就把谁的地址赋值给这个指针变量
    p = &a;
    // 打印p, *p, p指向了a的地址,*p就是a的值
    printf("p = %p, *p = %d\n", p, *p);

    return 0;
}

关于指针大小,可以通过,sizeof运算符获取,例如,

#include <stdio.h>

int main(int argc, char *argv[])
{
    char *p1;
    short int *p2;
    int *p3;
    long int *p4;
    float *p5;
    double *p6;
    
    printf("%d\n",sizeof(p1));
    printf("%d\n",sizeof(p2));
    printf("%d\n",sizeof(p3));
    printf("%d\n",sizeof(p4));
    printf("%d\n",sizeof(p5));
    printf("%d\n",sizeof(p6));
    
    return 0;
}

注意

  • 在 32 位系统下,所有类型的指针都是 4 个字节。

  • 在 64 位系统下,所有类型的指针都是 8个字节。

3 指针分类

按照其指向的数据类型分类,指针分类包括:

  • 字符指针,例如

// 定义了一个字符指针变量,只能存放字符型数据的地址编号
char ch;
char *p = &ch;
  • 短整型指针,例如

// 定义了一个短整型指针变量,只能存放短整型数据的地址编号
short num;
short *p = &num;
  • 整型指针,例如

// 定义了一个整型指针变量,只能存放整型数据的地址编号
int num;
int *p = &num;
  • 长整型指针,例如

// 定义了一个长整型指针变量,只能存放长整型数据的地址编号
long num;
long *p = &num;
  • 单精度浮点型指针,例如

// 定义了一个单精度浮点型指针变量,只能存放单精度浮点型数据的地址编号
float num;
float *p = &num;
  • 双精度浮点型指针,例如

// 定义了一个双精度浮点型指针变量,只能存放双精度浮点型数据的地址编号
double num;
double *p = &num;
  • 函数指针,例如

int add(int a, int b) 
{  
    return a + b;  
}

int (*func_ptr)(int, int);
  • 结构体指针,例如

// 定义结构体类型  
struct Student 
{  
    char name[50];  
    int age;  
    float score;  
};  
  
// 定义结构体指针  
struct Student *ptr;
  • 指针的指针,例如

// 定义一个整型指针  
int *ptr;      
// 定义一个指向整型指针的指针(二级指针)
int **pptr;     
  • 数组指针,例如

// 指向包含5个整数的数组的指针  
int (*int_array_ptr)[5]; 

// 指向任意长度双精度浮点数组的指针  
double (*double_array_ptr)[]; 

// 指向包含10个字符的数组的指针
char (*char_array_ptr)[10]; 
  • 通用指针,是一种特殊的指针类型,用void*来修饰。它可以指向任何类型的数据,包括结构体、数组、函数等,因此也被称为无类型指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值