Skip to content

Latest commit

 

History

History
87 lines (51 loc) · 2.82 KB

指针.md

File metadata and controls

87 lines (51 loc) · 2.82 KB

指针

指针是python中没有的概念.上语文课的时候,老师最长说的话是不是"请将课本翻到xxx页"?在那一页上有课上的内容,我们要看的是内容,但却使用页码标记内容,这就是指针的核心思想了.

指针是变量的地址,与之对应的是内存空间的标记,一本有页码的笔记本,在某一页上可以写着日记,也可以画着画,它只是被标记的空间而已,内容取决于需要.

取地址符&和指针运算符*

  • 要取到变量的地址,只用在变量前使用&就可以得到了
  • 如果我们想通过变量的地址获取它的值,那只要在地址前使用*就可以了

指针变量

存储变量地址的变量就是指针变量,他的声明形式很简单

类型* 变量名

这样变量中就是存的地址了,而要取出该地址中的值,同样的只要使用指针运算符即可

指针运算

指针也就是地址,在C中表现为可以运算的正整数数值,因此,它和int,long之类一样,是可以运算的,所用的运算符也是通常的运算符.

在C中我们可以直接通过运算来实现地址位置的偏移.这也是C作为系统语言的优势.

空指针

C中可以用NULL为任意指针变量赋值,他的意义是指针为空,或者说,指针变量没有指向任何地址

void类型的指针

void类型的指针很特殊,它有这样的性质:

  • void指针可以指向任何数据类型,如果要将void指针赋给其他类型指针,则需要强制类型转换如:pint= (int *)pvoid
  • 可以用任何类型的指针对void指针进行赋值和初始化
  • void指针无法进行指针操作 void* p就是一个典型的void指针,一般void指针用在内存操作,

因此void指针常用在:

  • 内存操作
  • 定义函数时,如果函数的参数可以是任意类型指针,那么应声明其参数为void*
  • 作为指向函数的指针

为什么要用指针?

如上面所说,指针是保存的一个变量的内存地址,那为什么要这么做呢?

C语言按值传递参数

和python中不同,C语言调用函数的方式是严格按值传递.

#include <stdio.h>

int add(int x){
    x++;
    printf("inner x:%d\n",x);
    return x;
}

int main(){
    int x = 4;
    printf("before add x:%d\n",x);
    int y = add(x);
    printf("after add x:%d\n",x);
    return 0;
}
before add x:4
inner x:5
after add x:4

上例中的add函数接收一个int类型的参数,在被调用时,传入的参数值会按顺序被复制给函数对应的栈中对应的变量中.

这样的好处是函数的结果的不会因为外部数据变化而受到影响,坏处就是也影响不到外面的变量数据.而如果希望函数改变外部数据,那就应该使用指针.因为传入的是一段地址,所以只要根据这段地址找到这个变量的值就行.