12月19号

…衆ロ難τιáo~ 提交于 2019-12-20 04:31:15

指针

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++)

{

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++)//一定要注意指针的当前位置

{

printf("%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++)//通过指针变量,为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,2,6,3,7,5};

}

int research(int a[],int x,int num)

{

int i;

for(i=0;i<num,i++)

{

if(a[i]==x)

{

return 1;

break;

}

}

}

/* Note:Your choice is C IDE */

#include “stdio.h”

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(t==1)

{

printf(“yes”);

}else

{

printf(“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(t==0)

{

printf(“man,fail”);

}else

{

printf(“success”);

}

}

int research(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 research(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==x)//如果指针指向数组,则指针可以带下标,等价于if((a+i)==x)

{

return 1;

// 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 insert(int a[],int index,int x,int
num)//在数组a中index位置插入元素x

{

int
i;

if(size==arraynum)

{

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 insert1(int a[],int x,int num)//在数组元素的最后追加x

{

if(size==arraynum)

{

return
0;//数组已满,不能插入,用0代表数组已满的情况

}

a[num]=x;

size++;

return
1;//用1代表正常插入元素的情况

}

int 
delete(int a[],int x,int num)//数组中的x如果存在则删除

{

int
research1(int a[],int x,int num);//对调用函数的声明

int
t,i;

t=research1(a,x,num);

if(t==-1)

{

return
0;//元素x不存在,用0表示

}

for(i=t;i<num-1;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==-1)

{

return
0;//元素x不存在,用0表示

}

a[t]=y;

return
1;

}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!