指针初步学习

指针

一、指针的概念和类型

(1)如果在程序中定义了一个变量,在对程序编译时,系统就会给这个变量分配内存单元。编译系统会根据程序中定义的变量类型,分配一定长度的空间。内存区的每一个字节有一个编号,这就是“地址”。“地址“相当于是旅馆中的房间号,在地址所标志的内存单元中存放的数据相当于房间中居住的旅客。在系统中通过地址能找到所需的变量单元,将”地址“形象化的称为“指针”。
(2)指针的类型有int、float、double…在定义指针变量时必须确定指针类型。int 变量的指针需要用 int 类型的指针存储,float 变量的指针需要用 float 类型的指针存储。

二、 指针变量

(1)定义指针变量

定义指针变量的一般形式: *类型名 指针变量名; 如:

int *a,*b;//int 型的指针变量
float *x;//float型的指针变量
char *y;//cahr型的指针变量

在上面的指针变量中“”表示该变量为指针变量。a,b是指针变量名,而不是a和*b。

(2)引用指针变量

引用时有三种情况:
1、给指针变量赋值;如:

p=&a;//把a的地址赋给指针变量p`

2、引用指针变量指向的变量;如:

p=&a;//把a的地址赋给指针变量p
printf("%d",*p);//以整数形式输出指针变量p所指向的变量的值,即变量a的值

3、引用指针变量的值;如:

p=&a;//把a的地址赋给指针变量p
printf("%o",p);//输出a的地址

指针变量应用的例子:

#include<stdio.h>
int main()
{
	int *p1,*p2,*p,a,b;   //int *类型的怕,篇
	scanf("%d,%d",&a,&b);
	p1=&a;                //使p1指向变量a
	p2=&b;                //使p2指向变量b
	if(a<b)
	{
	p=p1;
	p1=p2;                 //p1,p2的值互换
	p2=p;
	}
	printf("a=%d,b=%d\n",a,b);//输出a,b的值
	printf("max=%d,min=%d\n",*p1,*p2);//输出p1,p2指向的变量的值
return 0;
}

输出结果:
在这里插入图片描述

(3) 指针变量作为函数参数

函数参数不仅可以是整形、浮点型、字符型等数据类型,还可以是指针类型。它的作用是讲一个变量的地址传送到另一个函数中。
如:

void swap(int *p1,int *p2)//定义swap函数
{
int temp;
temp=*p1;  //不能写成*temp
*p1=*p2;   //*p1,*p2为指针变量
*p2=temp;
}

三、通过指针引用数组

(1)数组元素的指针

指针变量既然可以指向变量,当然也可以指向数组元素。所谓数组元素就是数组元素的地址。

int *p;      //定义p为指向整型变量的指针变量
int a[10];   //定义a为包含10个整形数据的数组
p=&a[0];     //p的值为a[0]的地址
p=a;         //p的值是数组a首元素(即a[0])的地址

在C语言中,数组名代表数组的首个元素(即序号为0的元素)的地址。

(2)引用数组元素时指针的运算

在**指针已指向一个数组元素时,**可以对指针进行如下运算:
加一个整数(用+或+=),如p+1;指向同一数组中的下一个元素;
减一个整数(用-或-=),如p-1;指向同一数组中的上一个元素;
自加运算,如p++,++p;
自减运算,如p–,--p;
两个指针相减,如p1-p2(只有p1和p2都指向同一数组中的元素时才有意义)
两个地址不能相加!
如果p的初值为&a[0],则p+i和a+i就是数组元素a[i]的地址。

(3)通过指针引用数组元素

引用数组元素有两种方法:
1、**下标法:**如a[i]的形式;
2、**指针法:**如 *(a+i)或 *(p+i)。其中a是数组名,p是指向数组变量的指针变量,其初值p=a。

int a[10];
int *p;
for(i=0;i<10;i++)
  scanf("%d",&a[i]);
for(i=0;i<10;i++)
  printf("%d",*(a+i));//通过数组名和元素序号计算元素地址,再找到该元素
int a[10];
int *p;
for(i=0;i<10;i++)
  scanf("%d",&a[i]);
for(p=a;p<(a+10);p++)
  printf("%d",*p);//用指针指向当前的数组元素

(4)用数组名作为函数参数

直接举一个例子:

void swap(int *x, int *y);
void main(){
	int x = 20, y = 10;
	swap(&x, &y);
	printf("x = %d, y = %d", x ,y);
}
void swap(int *x, int *y){
	int temp;
	temp= *x;
	*x = *y;
	*y = temp;
	}

这里传入的参数为指针,所以调用 swap 方法后 x,y 的内容发生了交换。如果直接传入 x,y,那么交换只在 swap 中有效,在 main 中并没有交换。

指针的内容不只这些,下节指针与多维数组,敬请期待!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值