3.C语言指针类型

69 阅读3分钟

1.定义

C语言中,为了方便的使用内存,提出了指针类型

首先来看看值传递的特点

看下图,定义了两个变量,其中将num1的值赋给了num2

#include <stdio.h>
void main() {
​
    int num1=90;
    int num2=num1;
    printf("%d %d",num1,num2); //输出:90 90
    printf("\n");
    
    //%p是按16进制输出变量,&是获取变量的内存地址
    printf("%p %p",&num1,&num2);//输出:0061FF1C 0061FF18
}

int num1=90:在内存中,给num1随机分配一个内存空间,内存地址为0061FF1C,值为90

int num2=num1:在内存中,给num1随机分配一个内存空间,内存地址为0061FF18,值为num1的值90

int num2=num1这种传递方式叫做值传递,两个变量都分配一个内存空间,并将值传递过去。修改num1的值不会影响num2。

但如果在函数传递时,基本类型如果传递指针,在函数修改时,也会直接修改这个指针变量指向的地址的值

指针类型:C语言中,任何数据类型,都有对应的指针类型

#include <stdio.h>
void main() {
    //定义一个int类型的变量
    int num=90;
    
    //定义一个int类型对应的指针类型,格式为int num,或者int num
    //int类型的变量只有int的指针才能接受,double 是不能接受的
    //&num是使用num变量的内存地址,下列代码表示将num变量的内存地址赋给pre指针变量
    int pre=&num;
    
    //打印两个变量的内存地址,输出:0061FF18 0061FF1C
    //表面上看是两个内存地址,但在内存中,看下图
    printf("%p %p\n",&num,&pre);
    
    
}

pre指针变量的值,实际上存储的就是num1的内存地址

printf("%p",pre); //打印pre变量存放的地址:0061FF18
printf("%p",pre);//打印目标地址的值:90

修改num的值,会影响到pre指针变量,因为两个变量最终使用的内存地址是一样的

num=80;
printf("\n%d",pre);//打印:80

2.指针的运算操作

指针自增运算,++,--

一个数组在内存中是连续分布的

当对指针变量进行++操作时,指针的地址会按照它的数据类型的字节数递增

int arr[]={10,100,200};
int* ptr=arr; //此时,指针指向了数据中首个元素的内存地址

ptr++;

此时对指针执行自增操作,指针会按照数据类型进行自增,指针是int类型,c中的int类型字节数为4

那么:ptr++=0x1133+4=0x1137

此时指针就指向了数组中0x1137内存地址的元素

指针+-运算

指针+2

多级指针

指针作为形参时要注意的问题

函数返回值是指针时要注意的问题

空指针