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

c语言指针2

时间:2018-05-27 18:02:15      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:指针


指针的重要性

#include <stdio.h>

/*
	指针的重要性:

		1,表示一些复杂的数据结构

		2,快速的传输数据

		3,使函数返回一个以上的值

		4,能直接访问硬件

		5,能够方便的处理字符串

		6,是理解面向对象语言中引用的基础

		总结:指针是c语言的灵魂

	
	 指针的定义:
			地址:
				
				内存单元的编号
				从零开始的非负数整数

				范围:如果是32位的机器就是从【0--4G-1】


			指针:
				
				指针就是地址,地址就是指针
				指针变量就是存放内存单元编号的变量,或者说指针变量就是存放地址的变量
				指针(0019FF38)和指针变量(p)是两个不同的概念
				但是要注意:通常我们叙述时会把指针变量简述为指针,实际含义并不一样
				指针的本质就是一个操作受限的非负整数(不能加乘除,可以减)


		
	 指针的分类:
			

		1,基本类型指针
		
			
					
						int * p;      // p是变量的名字,int *表示p变量存放的int类型变量的地址
									  // int *p 不表示定义了一个名字叫做*p的变量
									  // int *p 应该这样理解:p是变量名,p变量的数据类型是int *类型
									  //  所谓int *类型实际就是存放int变量地址的类型
 
						int i = 3;
						int j;
						p = &i;  
						
 
								1,p保存了i的地址,因此p指向i
 
								2,p不是i,i也不是p,更准确的说,修改p的值不会影响i的值,修改i的值也不会影响p的值
 
								3,如果一个指针变量指向了某个普通变量,则
             
										*指针变量   就完全等同于  普通变量
                     
										例子:
											如果p是个指针变量,并且p存放了普通变量i的地址
											则p指向了普通变量i
                         
											*p 就完全等同于i
											或者说:在所有出现*p的地方都可以替换成i
													在所有出现i的地方都可以替换成*p
													printf("%d\n",i); //输出3
													printf("%d\n",*p); //输出3
											*p 就是以p的内容为地址的变量
         
					
						j = *p;
 
						printf("i = %d ,j = %d ,*p = %d \n",i,j,*p);  //结果i = 3 ,j = 3 ,*p = 3
					
 
				

		

		2,指针和数组

		3,指针和函数

		4,指针和结构体

		5,多级指针



*/


int main(void)
{
		
	return 0 ;		
}

常见错误1

#include <stdio.h>


int main(void)
{

	int i = 5 ;
	int * p ;
	int * q;

	p = &i;

	//q = &i;
	
	//*q  = p; //error语法编译会出错  在这里*q是一个值,是一个int类型 而p是int * 是个地址,类型不一致,所以报错

	//*q = *p;  //因为q没有赋值,相当于没有地址,所以会分配垃圾地址,造成非授权访问,为了避免非授权访问,所以程序报错

	// p = q;  q是垃圾值,q赋给p p也变成垃圾值

	printf("%d\n",*q); //q的空间是属于本程序的,所以本程序可以读写q的内容,但是q的内部是垃圾值,则本程序不能读写*p的内容


	return 0;



}


常见错误2

#include <stdio.h>

//把5赋值给了一个不知道的单元,所以程序报错


int main(void)
{
	int * p;
	
	int i = 5;

	*p = i;
		
	
	printf("p的地址是%p\n",&p);
	printf("i的地址是%p\n",&i);
	printf("*p的值是%d\n",*p);
	//printf("%d\n",*p);
	
	return 0;


}


经典程序互换两个数字

#include <stdio.h>
/*
	*号的含义:
		1,乘法
		2,定义指针变量
		3,指针运算符
			该运算符放在已经定义好的指针变量的前面
			如果p是一个定义好的指针变量
			则*p表示以p的内容为地址的变量
				


 */



void huhuan_1(int ,int );
void huhuan_2(int * , int *);
void huhuan_3(int * , int *);

int main()
{
	int a = 3 ;
	int b = 5;

	huhuan_1( a, b);  	
	printf("a=%d,b=%d\n",a,b);  //a=3,b=5

	huhuan_2( &a, &b);  	    //huhuan_2( a, b);错误;	huhuan_2( *p, *q);也是错误的
	printf("a=%d,b=%d\n",a,b); //a=3,b=5
	
	huhuan_3( &a, &b);  	  
	printf("a=%d,b=%d\n",a,b); //a=5,b=3


	return 0;
}


//不能完成互换
void huhuan_1(int a,int b)
{
	 int t;

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

	 return;

}



//不能完成互换
void huhuan_2(int * p, int *q) //因为p和q才是变量,存储的是地址,所以在主函数里传过来的也是地址,所以是	huhuan_2( &a, &b);  
{

	int * t;
	
	 t =  p;
	 p =  q;
	 q =  t;
	

}

//可以完成互换
void huhuan_3(int * p, int *q) 
{

	int t;  //如果要互换*p和*q的值,则t必须定义成int,不能定义成int* 否则语法报错
	
	 t =  *p; //p是int * ,*p的int
	 *p =  *q;
	 *q =  t;
	

}


c语言指针2

标签:指针

原文地址:http://blog.51cto.com/tdcqvip/2120837

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