2019 12 19

指针
1、定义
基类型 * 指针变量名
2、赋值
int a;
int *pa=&a;// int a,*pa=&a;
int *p2;
p2=&a;
00
两个运算符
& 取地址,后面操作数必须是变量

  • 指针运算符,后面的操作数必须是指针
    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(t1)
{
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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值