指针是python中没有的概念.上语文课的时候,老师最长说的话是不是"请将课本翻到xxx页"?在那一页上有课上的内容,我们要看的是内容,但却使用页码标记内容,这就是指针的核心思想了.
指针是变量的地址,与之对应的是内存空间的标记,一本有页码的笔记本,在某一页上可以写着日记,也可以画着画,它只是被标记的空间而已,内容取决于需要.
- 要取到变量的地址,只用在变量前使用
&
就可以得到了 - 如果我们想通过变量的地址获取它的值,那只要在地址前使用*就可以了
存储变量地址的变量就是指针变量,他的声明形式很简单
类型* 变量名
这样变量中就是存的地址了,而要取出该地址中的值,同样的只要使用指针运算符即可
指针也就是地址,在C中表现为可以运算的正整数数值,因此,它和int,long之类一样,是可以运算的,所用的运算符也是通常的运算符.
在C中我们可以直接通过运算来实现地址位置的偏移.这也是C作为系统语言的优势.
C中可以用NULL
为任意指针变量赋值,他的意义是指针为空,或者说,指针变量没有指向任何地址
void类型的指针很特殊,它有这样的性质:
- void指针可以指向任何数据类型,如果要将void指针赋给其他类型指针,则需要强制类型转换如:
pint= (int *)pvoid
- 可以用任何类型的指针对void指针进行赋值和初始化
- void指针无法进行指针操作
void* p
就是一个典型的void指针,一般void指针用在内存操作,
因此void指针常用在:
- 内存操作
- 定义函数时,如果函数的参数可以是任意类型指针,那么应声明其参数为
void*
- 作为指向函数的指针
如上面所说,指针是保存的一个变量的内存地址,那为什么要这么做呢?
和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类型的参数,在被调用时,传入的参数值会按顺序被复制给函数对应的栈中对应的变量中.
这样的好处是函数的结果的不会因为外部数据变化而受到影响,坏处就是也影响不到外面的变量数据.而如果希望函数改变外部数据,那就应该使用指针.因为传入的是一段地址,所以只要根据这段地址找到这个变量的值就行.