C语言-指针的定义及使用

1.指针变量

通过指针,可以简化一些C编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的。所以,想要成为一名优秀的C程序员,学习指针是很有必要的。

什么是指针?

指针也就是内存地址,指针变量是用来存放内存地址的变量。就像其他变量或常量一样,必须在使用指针存储其他变量地址之前,对其进行声明。

int a = 10;
int* p = &a;

2.三要素

  • 名字:

 变量的名称可以由字母、数字和下划线字符组成。它必须以字母或下划线开头。大写字母和小写字母是不同的,因为C是大小写敏感的。

  • 空间

int整型,4 个字节,取值范围-2147483648到2147483647。

  • 地址

每一个变量都有一个内存位置,每一个内存位置都定义了可使用&运算符访问的地址,它表示了在内存中的一个地址。

 指针变量中存放的是谁的地址, *指针变量就是谁

3.指针数组和数组指针

  • 数组指针:指向数组的指针

int (*p)[n]

 ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n。数组指针实际上是一个指针变量,指向数组的指针变星(数组的指针), int(*p)[4]变量的类型可以看成int[4], int[4]+1就是加了(数组大小)*sizeof(类型),但是p的大小在32位中还是4字节(指针的大小)
指针的空间大小是固定的,只取决于当前的编译环境


  •  指针数组:存放指针的数组

int *p[n]

 []优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素地址。

 

4.指针常量和常量指针的区别

  • 指针常量是指定义了一个指针,这个指针的值只能在定义时初始化,其他地方不能改变。
  • 常量指针是指定义了一个指针,这个指针指向一个只读的对象,不能通过常量指针来改变这个对象的值。

指针常量强调的是指针的不可改变性,而常量指针强调的是指针对其所指对象的不可改变性。

注:无论是指针常量还是常量指针,其最大的用途就是作为函数的形式参数,保证实参在被调用函数中的不可改变特性。

5.习题: 

#include<stdio.h>
int main ( ) {
int a = 10;
int b = 20;
int* pa = &a;
int* pb = pa;
*pb = b;
b = 6;
printf ( "%d", a) ;
printf ( "%d", b);
printf ( "%d", *pa);
printf ( "%d", *pb) ;
pb = &b;
a = 8;
printf ( "%d", a);
printf ( "%d",b);
printf ( "%d",*pa);
printf ( "%d",*pb);
*pb = a ;
*pa = *pb;
pa = pb;
printf ( "%d", a);
printf ( "%d",b);
printf ( "%d", *pa);
printf ( "%d", *pb);
return 0;

6.多级指针

多级指针是指指针的指针,它可以用于多层次的间接引用和修改变量的值。通过多级指针,可以在不直接操作变量的情况下,通过连续的间接引用来访问和修改变量的值。

当声明多级指针时,每增加一个间接级别,就需要在变量名前添加一个星号(*)。例如,一个单级指针可以这样声明:

int *ptr;

而一个指向指针的指针(双级指针)可以这样声明:

int **ptr2;

以此类推,可以继续添加星号来声明更高级别的多级指针。

访问和修改值:
通过多级指针,可以通过连续的间接引用来访问和修改变量的值。对于一个n级指针,需要使用n次解引用操作(*)来访问最终的目标值。例如,对于一个双级指针ptr2指向一个指针ptr,再指向一个整型变量num的情况,可以使用两次解引用操作来访问和修改num的值,如下所示:

**ptr2 = 20;  // 修改 num 的值


多级指针在许多情况下非常有用。以下是一些常见的应用场景:

  • 动态内存分配:多级指针可用于管理动态分配的内存块,特别是在涉及多维数组或链表的数据结构时。
  • 传递指针参数:通过传递多级指针作为函数参数,可以在函数内部修改指针所指向的数据,实现对数据的间接修改。
  • 多级数据结构:多级指针可以用于处理多级嵌套的数据结构,例如树或图等。
  • 函数返回多个值:通过将多级指针作为函数的返回值,可以实现函数返回多个值的需求。

多级指针提供了更灵活和高级的间接引用方式,但也增加了代码的复杂性和理解难度。因此,在使用多级指针时,需要仔细考虑其适用性和代码的可读性,下面是一个使用多级指针的简单示例:

#include <stdio.h>

int main() {
    int num = 10;
    int *ptr;
    int **ptr2;

    // 将 num 的地址赋值给 ptr
    ptr = &num;

    // 将 ptr 的地址赋值给 ptr2
    ptr2 = &ptr;

    // 通过 ptr2 访问和修改 num 的值
    printf("num 的值为:%d\n", **ptr2);  // 输出:num 的值为:10

    **ptr2 = 20;  // 修改 num 的值

    printf("num 的值为:%d\n", **ptr2);  // 输出:num 的值为:20

    return 0;
}

在这个示例中,我们首先声明了一个整型变量 num,然后声明了一个指向整型变量的指针 ptr,再声明了一个指向指针的指针 ptr2。我们将 num 的地址赋值给 ptr,然后将 ptr 的地址赋值给 ptr2。通过 **ptr2,我们可以间接地访问和修改 num 的值。

多级指针在某些情况下非常有用,特别是在涉及函数参数传递、动态内存分配和数据结构等方面。它可以提供更灵活的操作和更高层次的间接引用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值