欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

指针(2)

程序员文章站 2024-01-01 21:27:58
...

1. 对“&”和“*”运算符说明

如果已执行了语句 pointer_1=&a;

(1)&* pointer_1的含义是什么?

“&”和“”两个运算符的优先级别相同,但按自右而左方向结合。
因此先进行
pointer_1的运算,它就是变量a,再执行&运算。
因此,&* pointer_1与&a相同,即指向变量a的地址。

如果有:pointer_2 =&* pointer_1;。它的作用是将&a(a的地址)赋给pointer_2 ,如果 pointer_2 原来指向b,经过重新赋值后它已不再指向b了,而指向了a。
指针(2)

(2)*&a的含义是什么?

先进行&a运算,得a的地址,再进行运算。即&a所指向的变量,也就是变量a。
&a和pointer_1的作用是一样的,都是取a的地址它们都等价于变量a。即
&a与a等价。

(3)(*pointer_1)++相当于a++?

注意括号是必要的,如果没有括号,就成为了pointer_1++,从附录可知:++和为同一优先级别,而结合方向为自右而左,因此它相当于*(pointer_1++)。
(先加加后取地址)

由于++在pointer_1的右侧,是“后加”,因此先对pointer_1的原值进行*运算,得到a的值,然后使pointer_1的值改变,这样pointer_1不再指向a了。

(4)实例:

先定义指针,然后指向地址
输入a和b,按先后大小输出a和b

#include <stdio.h>

void main()
{ 
      int *p1, *p2, *p, a, b;
      scanf("%d %d", &a, &b);
      p1 = &a;
      p2 = &b;
      //先定义指针,然后指向地址
      if( a < b)     
      {
            p = p1;
            p1 = p2;
            p2 = p;
      } 
      //此后,p1指向b的地址, p2指向a的地址 
      //p存在的意义和tmp一样   
      printf("a = %d, b = %d\n", a, b);
      printf("max = %d, min = %d\n", *p1, *p2);
}

指针(2)
对输入的两个整数按大小顺序输出!这次用函数实现交换功能!

#include <stdio.h>

void main()
{ 
      int a, b;
      int *pointer_1, *pointer_2;
      scanf("%d %d", &a, &b);
      
      pointer_1 = &a;
      pointer_2 = &b;
      
      if(a < b) 
      {
            swap(pointer_1, pointer_2); //swap实现的是交换
      }
      
      printf("\n%d > %d\n", a, b);
      
}

void swap(int *p1, int *p2)
{
      int temp;

      printf("I'm swapping……\n");
      printf("Please wait^_^");
      
      temp = *p1;  //temp = a;
      //p1指针指的是&a的地址(传进来的参数是pointer_1)
      *p1 = *p2;   //a = b;
      *p2 = temp;  //b = temp;
      
}

输入a、b、c 3个整数,按大小顺序输出

#include <stdio.h>

void main()
{
      void  exchange(int *q1, int *q2, int *q3);

      int a, b, c, *p1, *p2, *p3;

      scanf("%d %d %d", &a, &b, &c);
      p1 = &a;
      p2 = &b; 
      p3 = &c;
//swap(q1,q2);放这里会报错,因为swap定义在exchange里,这里没定义。
//用extend声明一下就可以了,证明在类内声明过了
      exchange(p1, p2, p3);  //确保a > b > c
      printf("%d %d %d\n", a, b, c);
}


void  exchange(int *q1, int *q2, int *q3) //int *q1 = p1;
{
      void swap(int *pt1, int *pt2); //用于交换&……&%

      if( *q1 < *q2 )
      {
            swap(q1, q2);
      }
      if( *q1 < *q3 )
      {
            swap(q1, q3);
      }
      if( *q2 < *q3 )
      {
            swap(q2, q3);
      }
}
 
void  swap(int *pt1, int *pt2)
{
      int temp;

      temp = *pt1;
      *pt1 = *pt2;
      *pt2 = temp;
}

2.数组与指针

一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。
指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中)。
所谓数组元素的指针就是数组元素的地址

(1)指向数组元素的指针

定义一个指向数组元素的指针变量的方法,与以前介绍的指向变量的指针变量相同。

int a[10]//0,1,2,3
 (定义a为包含10个整型数据的数组)
int *p;   
 (定义p为指向整型变量的指针变量)
 如果现在要取第三个
 p = &a[3]

应当注意,如果数组为int型,则指针变量的基类型亦应为int型。

(2)对指针变量赋值

p=&a[0];
把a[0]元素的地址赋给指针变量p。
也就是使p指向a数组的第0号元素
指针(2)

(3)通过指针引用数组元素

引用一个数组元素,可以用:
(1) 下标法,如a[i]形式;
(2) 指针法,如*(a+i)或*(p+i)。指向第i个元素

其中的a是数组名,p是指向数组元素的指针变量,其初值 p=a。(p=&a[0])
注意:数组名即“翻译成数组的第一个元素的地址!

实例
输出数组中的全部元素
假设有一个a数组,整型,有10个元素。要输出各元素的值有三种方法:
(1) 下标法(下表变量i)

void main()
{
      int a[10];
      int i;//下标变量
      
      for( i=0; i < 10; i++ )
      {
            scanf("%d", &a[i]);
      }
      
      printf("\n");
      
      for( i=0; i < 10; i++ )
      {
            printf("%d", a[i]);
      }
}

(2) 通过数组名计算数组元素地址,找出元素的值。(*(a+i))

void main()
{
      int a[10];
      int i;
      for( i=0; i < 10; i++ )
      {
            scanf("%d", &a[i]);
      }

      printf("\n");
      
      for( i=0; i < 10; i++ )
      {
            printf("%d", *(a+i));
            //*(a+0)就是a[0]的值,如果是int类型相当于加上4个字节就是第一个数
      }
}

(3) 用指针变量指向数组元素。(p这个指针指向数组a的首地址)

void main()
{
      int a[10];
      int i;
      int *p;
      
      for( i=0; i < 10; i++ )
      {
            scanf("%d", &a[i]);
      }
      
      printf("\n");
      
      for( p=a; p < (a+10); p++ )
      {
            printf("%d", *p);
      }
}

(4)错误例子

#include <stdio.h>

void main()
{
      int *p, i, a[10];

      p = a;

      for( i=0; i < 10; i++ )
      {
            scanf("%d", p++);
      }
      printf("\n");

      for( i=0; i < 10; i++, p++ )
      {
            printf("%d", *p);
      }
}

第一个p=a后,指针指向数组第一个元素的位置,经过第一次for循环后,p已经指向数组结尾了,这时如果没有第二个p=a重新把指针指向数组首元素,那么第二个循环里指针指向的位置的值是不确定的

上一篇:

下一篇: