指针
1.定义
基类型 * 指针变量名
2. 赋值
int a;
int * pa=&a;//int a,* pa=&a;
int * p2;
p2=&a;
两个运算符
& 取地址 ,后面操作数必须是变量
- 指针运算符,后面的操作数必须是指针
int a=3;
int * pa=&a;
&a 正确,表示a的地址
&pa 正确 表示pa的地址
*a 不对
*pa 正确,表示的是pa指向的变量,即a
*&a 正确,表示的是a
*&pa 正确 表示的是pa
&*a 不对
&*pa 正确,表示的是pa,即&a.
& *如果正确使用,则两个运算符相互抵消
void exchange(int *p1,int *p2)
{int t;
t=*p1;*p1=*p2;*p2=t;
}
void exchange(int *p1,int *p2)
{int * t;
t=p1;
p1=p2
p2=t;
}
利用指针访问(引用)数组
通过下标遍历数组元素
int a[]={1,2,3,4,5};
a表示的是数组首元素的地址,是一个地址常量,不能改变,等价&a[0]
int pa=a;//指针变量pa指向数组首地址
int pa=&a[0];
如果指针变量指向数组的首地址,此时指针变量可以使用下标,即指针变量等同于数组名
a[1]<=>pa[1]
当指针变量指向数组时,指针变量的加减运算才有意义
当指针变量pa指向数组a的首地址,且pa得值不能改变,一直指向数组的首地址,i表示下标
pa+i<>&a[i]<=>&pa[i]<=>a+i
表示的数组元素的地址
*(pa+i)<>a[i]<=>pa[i]<=>(a+i)
表示的是数组元素
void main()
{int a[10];
int i;
for(i=0;i<10;i++
scanf("%d",&a[i]);
/for(i=0;i<10;)
scanf("%d",&a[i++]);/
for(i=0;i<10;i++
scanf("%d",&a[i]);
/for(i=0;i<10;)
scanf("%d",&a[i++]);*/
for(i=0;i<10;i++
printf("%d",a[i]);
/for(i=0;i<10;)
printf("%d",a[i++]);*/
}
void main()
{int a[10];
int i;
int pa=a;
for(i=0;i<10;i++
scanf("%d",pa+i);
for(i=0;i<10;i++)
printf("%d",(pa+i));
}
//通过指针变量的改变,访问数组元素
void main()
{int a[10];
int i;
int *pa=a;
for(;pa<a+10;pa++)
scanf("%d",pa);
}
/*for(pa=a;pa<a+10;pa++,pa++)
printf("%d",*pa);
*/
void main()
{int a[10];
int i;
int *pa=a;
for(i=0;i<10;i++,pa++)
scanf("%d",pa);
/*for(i=0,pa=a;i<10;i++,pa++)//一定要注意指针的当前位置
printf("%d",*pa);
}
void main()
{int a[10]={1,2,3};
int i;
int *pa=&a[3];
for(i=3;i<10;i++,pa++)//通过指针变量,为a[3]-a[9]赋值
{scanf("%d",pa);
}
/for(i=3;i<10;i++,pa++)//通过指针变量,为a[3]-a[9]赋值
{scanf("%d",pa++);
}/
for(i=0,pa=a;i<10;i++,pa++)//一定要注意指针的当前位置,循环输出数组的所有元素
{printf("%d",*pa);
}
for(i=0,pa=a;i<10;i++)//一定要注意指针的当前位置,循环输出数组的所有元素
{printf("%d",pa++);
}/
}
用数组名作函数参数
void main()
{int a[10]={1,3,5,6,4,8}
}
int research(int a[],int x,int num)
{int i;
for(i=0;i<num;i++)
{if(a[i]==x)
{return 1;
}
}
}
int size=0;//全局变量,表示当前数组元素的个数
int arraynum;//全局变量表示数组的大小
void main()
{int a[10]={1,2,6,3,7,5};
int t,x,index;
int research1(int a[],int x,int num);
int insert(int a[],int index,int x,int num);
arraynum=10;
size=6;
scanf("%d",&x);
/* t=research(a,x,size);
if(t1)
{printf(“yes”);
}
elseprintf(“no”);*/
t=research1(a,x,size);数组名a做函数的实参,传递的是值(地址),即数组的首地址
if(t!=1)
printf("%d index is %d",x,t);
else
printf("%d is not in array",x);
scanf("%d%d",&index,&x);
t=insert(a,index,x,size);
if(t0)
printf(“man ,fail”);
else printf("success);
}
int research1(int a[],int x,int num);//a是int 类型的指针等价于int research(int a,int x,int num);
{
int i;
for(i=0;i<num;i++)
if(a[i]==x)//如果指针指向数组,则指针可以带下标,等价于if((a+i)x)
{return 1;
//break;一定不会执行到
}
}
return 0;
}
/*int research1(int a[],int x,int num);//a是int 类型的指针等价于int research(int a,int x,int num);
{int p=a;
//int p=a;错误,p是整型变量,a是指针变量,类型不一致,不能赋值
for(;a<p+num;a++)
if(a[i]==x)//如果指针指向数组,则指针可以带下标,等价于if((a+i)==x)
{return i;
//break;一定不会执行到
}
}
return 0;
}/
int research1(int a[],int x,int num);//查找数组中的x,返回x的下标
{int i;
for(i=0;i<num;i++)
if(a[i]x)
{return i;
//break;一定不会执行到
}
}
return -1;//如果x不在数组中,返回-1
}
int intsert(int a[],int index,int x,int num);//在数组a中index位置插入元素x
{int i;
if(sizearraynum)
return 0;//数组已满,不能插入,用0代表数组已满的情况
for(i=num-1;i>=index;i–)//后移
a[i+1]=a[i];
a[index]=x;//在index位值插入x
size++;
return 1;//用1代表正常插入的情况
}
int intsert(int a[],int index,int x,int num);//在数组元素的最后加x
{if(size=arraynum)
return 0//数组已满,不能插入,用0代表数组已满的情况
a[num]=x;
size++;return 1;//用1代表正常插入的情况
}
int delete(int a[],int index,int x,int num);//数组中的x如果存在则删除
{int research1(int a[],int x,int num);//对调用函数的声明
int t,i;
t=research1(a,x,num);
if(t1)
return 0;//元素不存在,用0表示
for(i=num-1;i>=index;i–)//将t 位置后的元素往前移动
a[i]=a[i+1];
size–;
return 1;//删除成功,用1表示
}
void update(int a[],int x,int y,int num)//将数组中的x更新成y
{int t,i;
t=research1(a,x,num);
if(t==0)
return 0;//元素x不存在,用0表
a[t]=y;
return 1;
}