C语言学习笔记

一.指针

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 = &num;
	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 的用法

三.函数指针和指针函数

持续更新中…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值