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

[size=medium]/*
第八章 地址和指针

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

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

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

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


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

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、指针的相互的转换,那么指针对应的值也跟着改变!

*/
[/size]
#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); //当传递的是指针存放的地址值
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值