学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。
目录
指针这里分为八个小部分,分别是“指针变量”、“通过指针引用数组”、“*通过指针引用多维数组”、“通过指针引用字符串”、“*指向函数的指针”、“*返回指针值的函数”、“*指针数组和多重指针”、“*动态内存分配与指向它的指针变量” 。
类型名 *数组名[数组长度]; int *p[4];
一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都存放一个地址,相当于一个指针变量。 指针数组比较适合用来指向若干个字符串,使字符串处理更加方便灵活。
将若干字符串按字母顺序(由小到大)输出。
- #include <stdio.h>
- #include <string.h>
- int main()
- { void sort(char *name[],int n); //函数声明
- void print(char *name[],int n); //函数声明
- char *name[]={"Follow me","BASIC",
- "Great Wall","FORTRAN","Computer design"};
- //定义指针数组,它的元素分别指向5个字符串
- int n=5;
- sort(name,n); //调用sort函数,对字符串排序
- print(name,n); //调用print函数,输出字符串
- return 0;
- }
-
- void sort(char *name[],int n) //定义sort函数
- { char *temp;
- int i,j,k;
- for(i=0;i<n-1;i++) //用选择法排序
- { k=i;
- for(j=i+1;j<n;j++)
- if(strcmp(name[k],name[j])>0) k=j;
- if(k!=i)
- { temp=name[i]; name[i]=name[k]; name[k]=temp;}
- }
- }
-
- void print(char *name[],int n) //定义print函数
- { int i;
- for(i=0;i<n;i++)
- printf("%s\n",name[i]);
- //按指针数组元素的顺序输出它们所指向的字符串
- }
在了解了指针数组的基础上,需要了解指向指针数据的指针变量,简称为指向指针的指针。
name是一个指针数组,它的每一个元素是一个指针型的变量,其值为地址。name既然是一个数组,它的每一元素都应有相应的地址。数组名name代表该指针数组首元素的地址。name+i是name[i]的地址。name+i就是指向指针型数据的指针。还可以设置一个指针变量p,它指向指针数组的元素。p就是指向指针型数据的指针变量。
name | name数组 | 字符串 | |
name[0] | Follow me | ||
p | name[1] | BASIC | |
name[2] | Great Wall | ||
name[3] | FORTRAN | ||
name[4] | Computer design |
定义一个指向指针数据的指针变量:char **p;
p的前面有两个*号。p指向一个字符指针变量(这个字符指针变量指向一个字符型数据)。如果引用*p,就得到p所指向的字符指针变量的值。
- p=name+2;
- printf(″%d\n″,*p); //name[2]的值(它是一个地址)
- printf(″%s\n″,*p); //以字符串形式(%s)输出字符串″Great Wall″
使用指向指针数据的指针变量。
- #include <stdio.h>
- int main()
- { char *name[]={"Follow me","BASIC","Great Wall","FORTRAN","Computer design"};
- char **p;
- int i;
- for(i=0;i<5;i++)
- { p=name+i;
- printf("%s\n",*p);
- }
- return 0;
- }
指针数组的元素也可以不指向字符串,而指向整型数据或实型数据等。
有一个指针数组,其元素分别指向一个整型数组的元素,用指向指针数据的指针变量,输出整型数组各元素的值。
- #include <stdio.h>
- int main()
- { int a[5]={1,3,5,7,9};
- int *num[5]={&a[0],&a[1],&a[2],&a[3],&a[4]};
- int **p,i; //p是指向指针型数据的指针变量
- p=num; //使p指向num[0]
- for(i=0;i<5;i++)
- { printf("%d ",**p);
- p++;
- }
- printf("\n");
- return 0;
- }
利用指针变量访问另一个变量就是“间接访问”。
如果在一个指针变量中存放一个目标变量的地址,这就是“单级间址”;
指针变量 | 变量 | |
地址 | → | 值 |
指向指针数据的指针用的是“二级间址”方法;
指针变量1 | 指针变量2 | 变量 | ||
地址1 | → | 地址2 | → | 值 |
从理论上说,间址方法可以延伸到更多的级,即多重指针。
指针变量1 | 指针变量2 | 指针变量n | 变量 | |||||
地址1 | → | 地址2 | → | ⋯ | → | 地址n | → | 值 |
指针数组的一个重要应用是作为main函数的形参。main函数的第1行一般写成
int main() 或 int main(void)
括号中是空的或有“void”,表示main函数没有参数,调用main函数时不必给出实参。
在某些情况下,main函数可以有参数,int main(int argc, char *argv[])
argc和argv就是main函数的形参,它们是程序的“命令行参数”。argc(argument count的缩写,意思是参数个数),argv(argument vector缩写,意思是参数向量),它是一个*char指针数组,数组中每一个元素(其值为指针)指向命令行中的一个字符串的首字符。
如果用带参数的main函数,其第一个形参必须是int型,用来接收形参个数(文件名也算一个参数),第二个形参必须是字符指针数组,用来接收从操作系统命令行传来的字符串中首字符的地址。