C 语言初级入门--地址和指针
程序员文章站
2022-04-30 19:36:07
...
/*
第八章 地址和指针
说明:每当我们使用一个变量系统就必须要给他开辟一个存储单元。系统要对它的值
进行记录。每时每刻的记录,怎样进行记录呢?系统会自动的开辟一个地方将该
变量监督起来,观察和记录它的变化。
变量的定义就是给变量开辟存储空间的地址!
存储空间是什么东西呢??
:计算机有一种硬件叫内存条,计算机的内存是以字节为单位的一片连续的存储
空间,每一个字节都有一个编号,这个编号就称为内存地址。
内存中的空间是连续的,地址号也是连续的,并且都是用二进制数来表示的;
定义变量就是向电脑系统交互,需要多大的空间存储数据,不能多页不能少;
指针:用来存放一个变量在内存中的地址,当要调用这个变量的时候能迅速的找到;
用来存储一个变量地址的变量就叫指针变量;
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、指针的相互的转换,那么指针对应的值也跟着改变!
*/
第八章 地址和指针
说明:每当我们使用一个变量系统就必须要给他开辟一个存储单元。系统要对它的值
进行记录。每时每刻的记录,怎样进行记录呢?系统会自动的开辟一个地方将该
变量监督起来,观察和记录它的变化。
变量的定义就是给变量开辟存储空间的地址!
存储空间是什么东西呢??
:计算机有一种硬件叫内存条,计算机的内存是以字节为单位的一片连续的存储
空间,每一个字节都有一个编号,这个编号就称为内存地址。
内存中的空间是连续的,地址号也是连续的,并且都是用二进制数来表示的;
定义变量就是向电脑系统交互,需要多大的空间存储数据,不能多页不能少;
指针:用来存放一个变量在内存中的地址,当要调用这个变量的时候能迅速的找到;
用来存储一个变量地址的变量就叫指针变量;
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); //当传递的是指针存放的地址值 } }
上一篇: PHP has xxx Problem
下一篇: 多Tag检索有没有什么好的优化方案