码迷,mamicode.com
首页 > 编程语言 > 详细

C语言编程入门——指针(上)

时间:2015-08-02 18:23:46      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:c语言   编程   入门   指针   

    指针,是C语言的灵魂,也是C语言与其他高级编程语言不同的地方,它可以灵活的操作内存,同样,也会带来很多问题,需要安全的使用指针。

    指针变量是指存放变量地址的变量,刚开始学可能会有点困难,需要多多理解。


指针常见错误1:

# include <stdio.h>

int main(void)
{
	int * p;  //定义int类型变量指针p
	int i = 3;

	*p = i; //此语句错误,*p未初始化,p存放了未知的地址,指向了未知的变量,如果被i修改,则会导致错误。

	printf("%d\n", *p);

	return 0;
}


指针常见错误2:

# include <stdio.h>

int main(void)
{
	long * p;
	double * q;
	int i = 3;
	double j = 5.5;
	long m = 5.5;

	//p = &j;//错误。
	//p = &m;//错误。
	//q = &i;//错误。
	//p = &i;//错误。
		 //注意:指针变量中,不同类型之间即使不会丢失精度,也不能够相互赋值。

	printf("%d\n", *p);
	printf("%lf\n", *q);

	return 0;
}

经典指针程序——互换两个数:

/*
	2013年1月22日17:31:51
	本程序可说明指针使函数返回多个值
	此处涉及到值传递、指针传递和引用传递的区别:
		值传递是将i、j的值复制给swap函数;
		指针传递是swap函数中的a,b指向主函数的i,j。
		引用传递是swap函数中的a,b与主函数的i,j是同一个数,可认为a,b是i,j的别名。
	具体此处不再赘述,在以后的学习中将会理解。
	虽然指针传递与引用传递类似,但不可将指针与引用混为一谈,即不可认为指针就是引用,引用就是指针。

		若不使用指针,则输出结果为:
							a = 5, b = 3  //即说明在函数内部数值已交换。
							i = 3, j = 5  //而在主函数内部数值未交换。

*/

# include <stdio.h>

//本函数为值传递,无法完成互换的要求。
void swap_1(int a, int b)
{	
	int t;

	t = a;
	a = b;
	b = t;

	printf("a = %d, b = %d\n", a, b);

	return;
}

//本函数为指针传递,但内部书写错误,将指针变量(地址)互换,指向互换,即原指针变量p指向a,q指向b,互换后,p指向b,q指向a。
void swap_2(int * p, int * q)
{
	int * t; //同类型才可相互赋值,所以将变量t定义为 int * 类型。
	
	t = p;
	p = q;
	q = t;  //即p、q是指向i,j的指针变量,更改p、q的值不会改变i,j的值,p,q,i,j是四个不同的变量。

	return;
}

//本函数为指针传递,可以完成相互要求。
void swap_3(int * p, int * q)
{
	int t;

	t = *p;
	*p = *q;
	*q = t;  //*p即为a,*q即为b,此处即为主函数中a,b互换。换言之:*p与a为同一变量,*q与b为同一变量。

	return;
}

int main(void)
{
	int i = 3;
	int j = 5;

	//swap_1(i, j);
	//swap_2(&i, &j);
	swap_3(&i, &j);  //指针传递,实参传递的应与形参类型一致,即传递地址,&i, &j。

	printf("i = %d, j = %d\n", i, j);

	return 0;
}


指针热身程序:

# include <stdio.h>

int main(void)
{
	int * p;  //定义整形指针变量,p是指针变量的名字,int * 表示p变量存放的是int类型变量的地址。
		   	  //p变量为int * 类型,即存放int变量地址的类型。
	int i = 3;
	
	p = &i;
	/*
		1. p保存了i的地址,因此p指向i,通过p可以找到i。
		2. p不是i,i也不是p,p与i是两个不同的变量。更准备地说:修改p的值不影响i的值,修改i的值不影响p的值。
		3. 如果一个指针变量指向了某个普通变量,则
			*指针变量  就完全等同于  普通变量
			例:如果p是个指针变量,并且p存放了普通变量i的地址
				则p指向普通变量i
				*p  就完全等同于 i, *p == i (*是取地址&的逆运算,可认为是取出指针所指向的普通变量。)
				或者说:在所有出现*p的地方都可以替换成i(除定义声明外)
						在所有出现i的地方都可以替换成*p
				*p 表示以p的内容为地址的变量
				所以,*p 就是 i,修改 *p 的值就是修改i的值。
	*/

	printf("i = %d\n", i);
	printf("i = %d\n", *p);
	
	*p = 99; //即修改了i的值。

	printf("i = %d\n", i);
	printf("i = %d\n", *p);

	return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

C语言编程入门——指针(上)

标签:c语言   编程   入门   指针   

原文地址:http://blog.csdn.net/lfhappypain/article/details/47208461

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!