学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。
目录
学习日记
前言编辑
一、什么是指针数组
例
二、指向指针数据的指针变量
例1
例2
三、指针数组作main函数的形参
注意
C语言指针操作
指针这里分为八个小部分,分别是“指针变量”、“通过指针引用数组”、“*通过指针引用多维数组”、“通过指针引用字符串”、“*指向函数的指针”、“*返回指针值的函数”、“*指针数组和多重指针”、“*动态内存分配与指向它的指针变量” 。
类型名 *数组名[数组长度]; int *p[4];
一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都存放一个地址,相当于一个指针变量。 指针数组比较适合用来指向若干个字符串,使字符串处理更加方便灵活。
将若干字符串按字母顺序(由小到大)输出。
#include
#include
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;i0) 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
在了解了指针数组的基础上,需要了解指向指针数据的指针变量,简称为指向指针的指针。
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
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
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型,用来接收形参个数(文件名也算一个参数),第二个形参必须是字符指针数组,用来接收从操作系统命令行传来的字符串中首字符的地址。
C语言指针操作(一)指针变量
C语言指针操作(二)通过指针引用数组
C语言指针操作(三)*通过指针引用多维数组
C语言指针操作(四)通过指针引用字符串
C语言指针操作(五)*指向函数的指针
C语言指针操作(六)*返回指针值的函数
C语言指针操作(七)*指针数组和多重指针
C语言指针操作(八)*动态内存分配与指向它的指针变量