C语言学习五

本文介绍了C语言中指针的基本概念,包括指针变量的声明、初始化,以及指针的运算如加法、减法和比较。文中还探讨了指针与数组的关系,指出数组名是首元素的地址,并展示了如何通过指针遍历和操作数组。此外,提到了指针数组和数组指针的声明及用途,以及多级指针的概念。
摘要由CSDN通过智能技术生成

        C语言学习第五天,对指针的初步学习。

一、指针概念

        每一个变量都有一个内存位置,每一个内存位置都定义了可使用 & 运算符访问的地址,它表示了在内存中的一个地址。内存单元的编号叫做地址,也称为指针;指针变量是用来保存这些地址的变量

二、指针声明        

        指针的声明比普通变量的声明多了一个一元运算符 “*”。运算符 “*” 是间接寻址或者间接引用运算符。

int *p;        // 声明一个 int 类型的指针 p
char *p        // 声明一个 char 类型的指针 p
int *arr[10]   // 声明一个指针数组,该数组有10个元素,其中每个元素都是一个指向 int 类型对象的指针
int (*arr)[10] // 声明一个数组指针,该指针指向一个 int 类型的一维数组
int **p;       // 声明一个指针 p ,该指针指向一个 int 类型的指针

        声明一个指针变量并不会自动分配任何内存。在对指针进行间接访问之前,指针必须进行初始化或者将指针变为空指针(NULL 指针是一个特殊的指针变量,表示不指向任何东西),否则我们并不知道指针指向哪儿,这将是一个很严重的问题。

#include<stdio.h>
int main(){
    int x=1;
    int *p=&x;        //指针必须初始化,或者将指针变为空指针;即 int *p=NULL;
    printf("%d \n",*p);
    return 0;
}

三、指针的运算

        指针运算是在编程中使用指针变量进行计算的过程。

     常见的指针运算包括以下几种:

  1. 指针的加法运算:通过给指针加上一个整数,可以移动指针指向的内存地址。例如,ptr + n 表示将指针 ptr 向前移动 n 个元素大小的内存单元。

  2. 指针的减法运算:通过给指针减去一个整数,可以向后移动指针指向的内存地址。例如,ptr - n 表示将指针 ptr 向后移动 n 个元素大小的内存单元。

  3. 指针之间的减法运算:可以计算两个指针之间的元素个数。结果将是一个整数值,表示两个指针之间相隔的元素个数,而不是字节数。

    #include <stdio.h>
    
    int main(){
        int a[10] = {1,2,3,4,5,6,7,8,9,0};
        int sub;
        int *p1 = &a[2];
        int *p2 = &a[8];
    
        sub = p2-p1;                                                                            
        printf("%d\n",sub);    // 输出结果为 6
    
        return 0;
    }
  4. 指针与整数之间的比较运算:可以比较指针和整数之间的大小关系。例如,ptr > n 表示指针 ptr 指向的地址大于 n

四、指针与数组

        在C语言中,数组可以被视为一系列相同类型的元素的集合,而指针是用于存储变量地址的特殊变量类型。指针与数组之间有着紧密的联系。事实上,数组名本身就是一个指向数组首元素的指针。通过使用指针,我们可以轻松地对数组进行访问和操作。我们可以使用指针算术运算来遍历数组,也可以通过指针传递数组给函数,以便在函数中对其进行修改。

        例如:定义一个整型数组,利用指针遍历该数组

#include<stdio.h>
int main(){
    int arr[]={1,2,3,4,5};
    int *p=arr;            //此时,指针指向数组的首元素
    for(int i=0;i<5;i++){  //利用指针遍历数组  
        printf("%d ",*(p+i));
    }
    return 0;
}

注意:int *p=arr,  int *p=&arr,   int *p=&arr[0]的区别:

#include<stdio.h>
int main(){
    int arr[]={1,2,3,4,5};
    int *p=arr;            //指向数组的首元素
    int *p1=&arr;          //指向整个数组
    int *p2=&arr[0];       //指向数组的首元素
    return 0;
}

另外,数组名不表示首元素的另一种情况是:sizeof(arr),这里的arr指整个数组。常用于计算数组长度:

#include<stdio.h>
int main() {
	int arr[] = { 1,2,3,4,5 };
	int len = 0;
	len = sizeof(arr) / sizeof(arr[0]);
	printf("数组arr的长度为:%d\n", len);
	return 0;							//输出结果:数组arr的长度为:5
}

五、指针数组

 指针数组是一个数组,数组中的每一个元素都是指针。声明一个指针数组的方法如下:

int *p[5];    // 声明一个指针数组,该数组有5个元素,其中每个元素都是一个指向int类型的指针

        由于 [] 的优先级比 * 高,故 p 先与 [] 结合,成为一个数组 p[];再由 int * 指明这是一个 int 类型的指针数组,数组中的元素都是 int 类型的指针。数组的第 i 个元素是 *p[i],而 p[i] 是一个指针。由于指针数组中存放着多个指针,操作灵活,在一些需要操作大量数据的程序中使用,可以使程序更灵活快速。

六、数组指针

数组指针是一个指针,它指向一个数组。声明一个数组指针的方法如下:

int (*p)[5];        // 声明一个数组指针 p ,该指针指向一个数组

        由于 () 的优先级最高,所以 p 是一个指针,指向一个 int 类型的一维数组。

七、多级指针

1、一级指针:一个指针变量中存储的是一个普通变量的地址,像这样的指针,我们就称之为一级指针。

2、二级指针:一个指针变量中存储的是一级指针变量的地址,那么久称之为二级指针。

3、三级指针:一个指针变量中存储的是二级指针变量的地址,那么就称之为三级指针。

......依次类推

多级指针声明:

int x=5;
int *p1=&n;    //一级指针
int **p2=&p1;    //二级指针
int ***p2=&p2;    //三级指针

八、总结

        以上部分只是对指针的初步了解,对于C语言来说,学好指针是重中之重,这不仅需要理论知识的学习,还需要实践练习。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值