一.指针
1. 指针的知识点
指针的存在就是为了间接访问
1.1 指针变量的两种类型
自身的类型和指向的类型
例: int * P = NULL;
自身的类型:在指针变量定义的时候,将变量名拿掉(即P),剩下 int * ,这就是指针变量的类型;
指向的类型:在指针变量定义的时候,将变量名和距离最近的*拿掉(即 *P),剩下(int )就表示P指向的类型是int .
指针变量指向类型的作用:决定了指针变量所取内容的宽度,即指针变量+1 跳过的单位跨度。
1.2指针的定义
1).先定义再赋值
int a =12;
int *p;
p = &a;
2).定义的同时赋值
int a =12;
int *p = &a;
1.3 指针的++运算
*p++ , * 和++ 的优先级相同,但++ 后置,所以先输出,后加一,实际使用与 i++类似。
int a[5]= {111,222,333,444,555};
int *p = &a[0];
printf ("*p = %u\n", *p++); //*p ,p=p+1 ,即: 先输出a[0]后,再指针加一
实际输出:
*p = 111
*++p,先指针加一,即输出a[1]
int a[5]= {111,222,333,444,555};
int *p = &a[0];
printf ("*p = %u\n", *++p); //*(p+1) ,即:先指针加一,后输出a[1],
实际输出:
*p = 222
2.指针实践编程
2.1 实现两个数的交换
(1) 不使用指针,使用实参f发现不能进行交换
# include <stdio.h>
int main (void)
{
int a = 12;
int b = 34;
printf ("before swap a = %d , b = %d\n " ,a , b );
swap(a,b); 不能实现交换
printf ("after swap a = %d , b = %d\n " ,a , b );
return 0;
}
int swap(x,y)
{
//当函数运行时如下的两条指令作为隐含指令,这样我们就能发现这种方法只是单纯
//对x和y进行操作而已,并没有实际改变a和b的值
x = a;
y = b;
int temp;
temp = x;
x = y ;
y = temp ;
}
执行结果如下:
before swap a = 12 , b = 34
after swap a = 12 , b = 34
(2)使用指针传参实现交换
# include <stdio.h>
int main (void)
{
int a = 12;
int b = 34;
printf ("before swap a = %d , b = %d\n " ,a , b );
swap_pointer(&a,&b); //可以实现两个数的交换。
printf ("after swap a = %d , b = %d\n " ,a , b );
return 0;
}
int swap_pointer(int *p1,int *p2)
{
//如下两条指令为隐含条件,这样的话我们就通过间接访问实际操作的就是实参a 和 b了
//p1 = &a;
//p2 = &b
int temp;
temp = *p1;
*p1= *p2 ;
*p2 = temp ;
}
执行结果如下:
before swap a = 12 , b = 34
after swap a = 34 , b = 12
(3)使用结构体传参实现交换
#include <stdio.h>
void swap(int *p1,int *p2);
struct mystruct
{
int a;
int b;
};
int main(void)
{
struct mystruct num ={3,5};
printf("Before swap : a = %d b = %d.\n",num.a,num.b);
struct mystruct *p;
p = #
swap(&(p->a),&(p->b));
printf("After swap : a = %d b = %d.\n",p->a,p->b);
return 0;
}
void swap(int *p1,int *p2)
{
int temp;
temp = *p1;
*p1= *p2 ;
*p2 = temp ;
}
执行结果
Before swap : a = 3 b = 5.
After swap : a = 5 b = 3.
总结
当形参和实参不是指针类型时,在该函数运行时,形参和实参是不同的变量,他们在内存中位于不同的位置,形参将实参的内容复制一份,在该函数运行结束的时候形参被释放,而实参内容不会改变。
对于程序(1)我们发现实参的内容没有被改变。
特别注意:在使用指针传参时,不要在函数里改变指针的地址,否则就会导致传参的不成功。
其他方法: 使用加减、乘除、异或 产生中间变量,也可实现两个数的交换,详情请访问如下链接
http://c.biancheng.net/cpp/html/494.html
二.typedef 的用法
三.函数指针和指针函数
持续更新中…