优秀的编程知识分享平台

网站首页 > 技术文章 正文

大话C语言:指针

nanyue 2024-12-31 13:37:37 技术文章 4 ℃

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 = #
  • 整型指针,例如
// 定义了一个整型指针变量,只能存放整型数据的地址编号
int num;
int *p = #
  • 长整型指针,例如
// 定义了一个长整型指针变量,只能存放长整型数据的地址编号
long num;
long *p = #
  • 单精度浮点型指针,例如
// 定义了一个单精度浮点型指针变量,只能存放单精度浮点型数据的地址编号
float num;
float *p = #
  • 双精度浮点型指针,例如
// 定义了一个双精度浮点型指针变量,只能存放双精度浮点型数据的地址编号
double num;
double *p = #
  • 函数指针,例如
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*来修饰。它可以指向任何类型的数据,包括结构体、数组、函数等,因此也被称为无类型指针。

4 指针和变量的关系

  • 指针可以存放变量的地址编号
  • 通过指针变量间接修改变量的值
#include <stdio.h>

int main() 
{
    // 定义一个int类型变量num1,同时赋值为0
    int num1 = 0;
    // 定义int *指针变量,同时赋值a的地址
    int *p = &num1;
    // 通过指针间接修改a的值
    *p = 123;
    printf("num1 = %d\n", num1);
    
    // 定义一个int类型变量b,同时赋值为5
    int num2 = 5;
    // p 保存 num2的地2
    p = &num2;
    // 通过指针间接修改b的值
    *p = 20;
    printf("num2 = %d\n", num2);

    return 0;
}



---E N D---

喜欢的记得关注哦!

您的支持是我们前进的动力!

职创未来|专注IT与新能源领域中高端人才培养

Tags:

最近发表
标签列表