欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C 语言初级入门--地址和指针

程序员文章站 2022-03-02 11:57:54
...
/*
第八章  地址和指针

  说明:每当我们使用一个变量系统就必须要给他开辟一个存储单元。系统要对它的值
进行记录。每时每刻的记录,怎样进行记录呢?系统会自动的开辟一个地方将该
变量监督起来,观察和记录它的变化。

  变量的定义就是给变量开辟存储空间的地址!

  存储空间是什么东西呢??
:计算机有一种硬件叫内存条,计算机的内存是以字节为单位的一片连续的存储
空间,每一个字节都有一个编号,这个编号就称为内存地址。
内存中的空间是连续的,地址号也是连续的,并且都是用二进制数来表示的;

  定义变量就是向电脑系统交互,需要多大的空间存储数据,不能多页不能少;


  指针:用来存放一个变量在内存中的地址,当要调用这个变量的时候能迅速的找到;
用来存储一个变量地址的变量就叫指针变量;

  1、指针变量的定义和指针变量的基本类型:
一:格式:
类型名 *指针变量名1, *指针变量名 2....
例如:
int *pi,*pj;
与之前不一样的地方就是在变量的前面加上了一个*.*是一个说明符,
用来说明该变量是指针变量。*号省略的话就和普通的变量一样了。
int *pi; 只能存放整数型变量的地址
char *ch; 只能存放字符变量的地址;
pi=&a; 让指针存放一个变量的地址;
& 取址符, * 叫指针运算符;

存放指针变量地址的一个对象?
int **p,*s;
p=&s;
**p :是专门用来存放指针地址的,它就是指向指针的指针;

  2.1、给指针变量赋地址值
1、一个指针变量可以通过不同的方式获得一个确定的地址值,从而指向一个具体的对象;
2、可以通过赋值运算,把一个指针变量中的地址值赋给另一个指针变量,从而
使这两个指针指向同一地址;

例子:int k,*p,*q;
q=&k; p=q; //指针变量的两边的类型必须是一致的;

3、空指针,不是指向地址为0 存储单元,而是一个有确定的值"空";

  2.2、对指针变量的操作:
C 语言提供一个称为“间接运算符”的单目运算符:“*”当指针变量中存放了
一个确切的地址值时,就可以用“间接运算预算符”通过指针来引用该地址的存储单元;

  例如:int *p,i=10,j;
p=&i;
指针赋值:j=*p;

  对上面这个例子的理解:j变量的值是有指针指向的空间中的值赋予的。
  这里的*p 代表指针p中存放的变量i的地址中的值。*不是乘而是用来说明指针的说明符;

    再如:j=*p+1; 代表指针p指向的空间中的值加1后的值给了变量j;

再如;int *p,k=0;
p=&k;
*p=100;
*p+=1;
解释:当*p 出现在赋值号左边时,代表的是指针所指的存储单元,当
*p 出现在赋值号右边的时候,代表的是指针所指的存储单元的内容;

3、移动指针:
所谓移动指针就是对指针变量加上减去一个整数,或通过运算符,使
指针指向相邻的存储单元;

注:对指针进行加减运算时,数字“1”不再代表十进制数1,而是指一个单位存储单元长度。
这个单元到底有多长,要看存储数据的类型了。
例:如果是int则代表1个存储单元长度就是位移四个字节,
char 类型 1个存储单元就是1个字节
double   1 8个字节;

3.2、函数之间地址值的传递
1、形参为指针变量时参数和形参之间的数据传递:
*** 若函数的形参为指针类型,调用该函数时,对应的实参必须是类型相同的地址值或者
是已指向某个存储单元的指针变量;
int *a;----整型的指针变量;

2、通过传送地址值在被调用函数中直接改变调用函数中的变量的值

3、指针的相互的转换,那么指针对应的值也跟着改变!

*/
#include<stdio.h>
int myadd(int *a,int *b)
{
	int sum;
	return *a+*b;
}
//传递地址值
void swap(int *a,int *b);
void order(int*,int*);
main()
{
	/*
	int a,b,min,*pa,*pb,*min;
	pa=&a;pb=&b;min=&min;	//指针指向具体的变量
	scanf("%d%d",pa,pb);	//直接放入两个指针,存储的是地址 *pa *pd 代表的 是指针地址里面的值
	printf("a=%d,b=%d\n",a,b);
	//printf("a=%d,b=%d\n",*pa,*pb);	//通过空间地址找值
	*pmin=*pa;
	if(*pa>*pb)
	{
		*pmin=*pb;
	
	}
		printf("变量值:min=%d\n",min);
		//printf("通过指针空间地址里面的值:min=%d\n",*min);
	*/

	//函数之间形参传值
	int x,y,z;
	int *q,*p;	//定义指针变量
	q=&x,p=&y;	// 给指针变量地址取址
	printf("enter x,y.\n");
	scanf("%d%d",&x,&y);
	z=myadd(q,p);
	printf("%d+%d=%d\n",x,y,z);

	printf("指针案列如下:\n");


  }

void swap(int *a,int *b)	//指针变量 存储地址
{
	int t;
	printf("");
	t=*a; *a=*b;*b=t;
	printf("");
}
//判断
// 参数传递时:加*表示传递的是地址值,不加* 表示传递的是地址
void order(int *a,int *b)
{
	if(*a>*b)
	{
		swap(a,b);	//当传递的是指针存放的地址值
	}
}