C语言学习与总结---第八章:指针[01]

指针[01]

  • 8.1 指针和指针变量的区别
  • 8.2 指向变量的指针变量
    • 8.2.1 指针变量的定义
    • 8.2.2 取地址运算&和间接寻址符*
    • 8.2.3 指针赋值
    • 8.2.4 区别
  • 8.3 指针变量作为函数参数

8.1 指针和指针变量的区别

一个变量的(内存)地址称为该变量的“指针”,通过指针能找到以它为地址的内存单元。而指针变量是用来存放另一个变量的地址的(即指针)。
指针变量是一种特殊的变量,它是存放地址的。

8.2 指向变量的指针变量

8.2.1 指针变量的定义

定义指针变量的一般形式:

基类型  *指针变量名;

例如

float  *pointer_3;     char  *pointer_4;  

8.2.2 取地址运算&和间接寻址符*

利用取地址运算符 & 让指针指向变量
方式一

int i, *p;  
…  
p = &i;            // 取得变量i的地址,赋值给指针变量p 

方式二

int i;  
int *p = &i;       // 在声明指针变量的同时也可以对其初始化 

方式三

 int i, *p = &i;    // 可并列在一条声明语句中  

当p指向i时,*p 就是i的别名:*p 即 i;改变 *p 的值,同时也会改变i的值。例如

#include  
int main()  
{  
    int i, * p;  
    p = &i;  
    i = 1;  
    printf("%d\n", i);         //prints 1  
    printf("%d\n", *p);       //prints 1  
    return 0;  
} 

再如

int i, * p;  
p = &i;  
*p = 2;  
printf("%d\n", i);    //prints 2  
printf("%d\n", *p);   //prints 2

8.2.3 指针赋值

int i;  
int* p = &i;  
int* q;  
q = p;  
printf("%d\n", *q);    //此时*q指向了i 
int i;  
int* p = &i;  
int* q;  
*p = 1;  
q = p;  
printf("%d\n", *q);    //prints 1
int i;  
int* p = &i;  
int* q;  
q = p;  
*q = 2;  
printf("%d\n", *p);    //prints 2  

8.2.4 区别

(1)p=q和*p=*q

int i;  
int* p = &i;  
int* q;  
q = p; 

使指针q指向了指针p所指向的目标,是指针本身的操作,即地址的操作;

int i = 1, j, * p, * q;  
p = &i;  
q = &j;  
*q = *p;  
printf("%d\n", *q);    //prints 1 

p指向的变量i的数值赋给了指针q,操作的是指针指向的目标;

(2)若已经执行了p=&i;则

(i)*p就是i;
(ii)&*p就是&i;都是i的地址
(iii)*&i就是i;
(iv)(*p)++就是i++;
int* p1, * p2, * p, a, b;  
scanf("%d,%d", &a, &b);      //input 2,3  
p1 = &a;  p2 = &b;  
if (a < b)  
{  
    p = p1;   p1 = p2;   p2 = p;  
}  
printf("a = %d,b = %d\n", a, b);           //a=2,b=3  
printf("max = %d, min = %d\n", *p1, *p2);  //max=3,min=2  

上面的代码还可以简写为:

int* p1, * p2, a, b;  
scanf("%d,%d", &a, &b);      //input 2,3  
p1 = &a;  
p2 = &b;  
if (a < b)  
{  
    p1 = &b;  
    p2 = &a;  
}  
printf("a = %d,b = %d\n", a, b);           //a=2,b=3  
printf("max = %d, min = %d\n", *p1, *p2);  //max=3,min=2 

8.3 指针变量作为函数参数

指针变量可以作为函数参数,作用是将一个变量的地址传递到另一个函数中。

#include  
int main()  
{  
    void swap(int* p1,int* p2);  
    int a, b, * p1, * p2;  
    scanf("%d,%d", &a, &b);  
    p1 = &a;  
    p2 = &b;  
    if (a < b) swap(p1, p2);  
    printf("max = % d, min = % d\n", a, b);  
    return 0;  
}  
void swap(int* p1, int* p2)  
{  
    int temp;  
    temp = *p1;  
    *p1 = *p2;  
    *p2 = temp;  
}  

注意两种错误的交换函数

 void swap(int a, int b)  
{  
    int t;  
    t = a;  
    a = b;  
    b = t;  
}  
void swap(int* p1, int* p2)  
{  
    int *temp;  
    *temp = *p1;  
    *p1 = *p2;  
    *p2 = *temp;  
}

总结:实参和形参之间的数据传递是单向的:实参传给形参的是地址值,通过间接寻址符*修改指针所指向的对象的值。

不可以 改变实参指针变量的值;
但可以 改变实参指针变量指向的变量的值

#include   
int 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;  
    exchange(p1, p2, p3);  
    printf("%d,%d,%d\n", a, b, c);  
    return 0;  
}  
void exchange(int* q1, int* q2, int* q3)  
{  
 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;  
} 

你可能感兴趣的:(C语言,指针,c语言,指针)