指针复习:
"*"的作用:
1)定义指针变量 int *p;
2)访问指针所指向的变量 *p=a;
3)int *p;p=&a;x=*p++;
将p指针的变量a的值赋给变量x,然后修改了指针的值,指针的值不再指向a。
指针变量的初始化
1)int a;int *p1=&a;int *p2=p1;
//在定义指针p1的同时给其赋值,使得p1指向变量a。
2)初始化时变量名前面的"*"只是表示它是指针变量。
3)不能用数值初始化指针的值。
指针作为参数的函数
void swap2(int *px,int *py)
在函数中改变了*px的值,就改变了其代表实参的存储内容。
指针进阶
指针数组:指针变量构成的地址
char*color[5];
操作时既可以直接对数组元素进行赋值和引用,也可以间接访问数组元素所
指向的单元内容,改变或引用该单元的内容。
指向指针的指针
二级指针的定义:
int a=10;
int *p=&a;
int* *pp=&p;
一级指针指向整型变量a,二级指针pp指向一级指针p;
p指向a p=&a;//a和*p指向同一个单元
pp指向p pp=&p;//p和*pp代表同一个单元。
因此:
&&a = &p = pp等价
&a = p = *pp等价
a = *p = **pp等价
二级指针的操作:
int a=10,b=20,t;
int *pa=&a,*pb=&b,*pt;
int **ppa=&pa,**ppb=&pb,**ppt;
//**ppa,*pa,a三者等价;
//**ppb,*pb,b三者等价;
二维数组的指针形式:
char *a[ ][ ];
二维数组名a是一个二级指针,而a[0]是一级指针;
a+1是第一行的地址,*(a+1)是第一行首元素的地址,**(a+1)是第一行首元素的值。
a+i是第i行的地址,*(a+i)是第i行首元素的地址,**(a+i)是第i行首元素的值。
a[i]等价于*(a+i) a[i][j]等价于*(*(a+i)+j)//第i行第j列。也可以写成*(a[i]+j)。
#include<stdio.h>
#include<string.h>
//奥运五环色
int main()
{
int i;
//指针数组的初始化
char*color[5]={;
char str[20];
printf("Input a color: ");
scanf("%s",str);
for(i=0;i<5;i++)
{
if(strcmp(str,color[i])==0)
break;
}
if(i<5)
printf("posistion: %d\n",i+1);
else
printf("not found\n");
return 0;
}
二级指针处理
#include<stdio.h>
#include<string.h>
int main()
{
int i;
char*color[5]={"red","blue","yellow","green","black"};
//指针数组初始化
char**pc;
char str[20];
pc=color;//pc=&color[0]
//pc指向数组color的首个元素
//*pc=color[0];
// *color[0]和**pc表示的内容都是字符'r';
//*[pc+i]于color[i]代表同一单元。
printf("input a color: ");
scanf("%s",str);
for(i=0;i<5;i++){
if(strcmp(str,*(pc+i))==0)
break;
}
if(i<5)
printf("position:%d\n",i+1);
else
printf("not found\n");
return 0;
}