特征(3):指针是什么
总结卡片:

指针是存放地址的变量。
指针里面的地址指向某个存储块,存储块里面可以是一个基本类型的值,也可以是另一个地址。
使用指针p,表示使用p存放的地址,比如用来比较地址的大小;使用p,则表示使用p内地址指向的内容,这时有指向。可以通过下面的图示来理解:

地址是很重要的东西,因为程序在内存运行时只有数据(包括指令),而数据都有地址,拿到地址那读写就成为可能。指针保存了地址,如果把这个指针(或地址)分发给不同的函数或模块,那就意味着不同的函数都有可能访问或修改这个地址指向的内容,这是使用指针的便利与风险。
数组是一个数据结构,把某个类型的东西放在一起,在内存上数组是连续的字节单元。
数组的寻址会转换成指针的操作,比如a[i]等价于(a+i)。(p-2)等价于p[-2]。
数组的地址,就是第一个元素的地址,比如a等价于&a[0]。数组的地址是常量不可修改(不能a=p),而指针是变量可以修改(可以p=a)。
注意char msg="123"与char arr[]="123"的区别:msg是指针变量,可以赋予一个新的地址,而arr是字符数组,初始化为“123”再加一个结束符'\0',arr是常量不能再赋予新的值;另外,msg当前指向字符串常量,不能修改字符串常量的内容,否则一般是蹦出崩溃,而arr这个数组的内容可以修改。
数组存放的是同一类型的变量,比如可以放int类型的变量,自然也可以放指针变量。以下这个例子把字符串指针放在数组中,再对字符串进行了排序:
#include
#include
void swap(char* arr[], int i, int j) {
char* t=arr[i];
arr[i]=arr[j];
arr[j]=t;
}
void qsort(char* arr[], int l, int r) {
if(l>=r) return;
int t=l;
for(int i=l+1; i<=r; i++)
if(strcmp(arr[i], arr[l])<0)
swap(arr,i,++t);
swap(arr,t,l);
qsort(arr,l,t-1);
qsort(arr,t+1,r);
}
int main() {
char* arr[] = {"abchello", "a123", "a12", "890", "89a", "891", "23abc12", "23abc", "myname", "is", "xiaocheng"};
int cnt=sizeof arr / sizeof *arr;
printf("before sort:\n");
for(int i=0;i
以上代码,两两比较时,以前的例子是两个int的大小比较,这里是两个char的比较,调用strcmp来完成两个字符串大小的比较。数组中存放的是字符串指针变量(即这是一个char的数组),操作上跟int变量的数组是类似的。执行效果如下:
