2019-8-8
指针基础(一)
1、变量的内存地址
①%p格式符,表示输出变量的地址值(地址值是十六进制的无符号整数表示)
②变量类型所占存储空间
整型:4个字节
字符型:1个字节
③变量的地址:变量在内存中所占存储空间的首地址
变量的值:变量在存储空间中存放的数据
2、指针变量的定义以及初始化
①定义形式类型关键字 *指针变量名;
定义指针变量时将其初始化为NULL,指针变量只能指向同一基类型的变量
②定义时同时对其进行初始化:
方法一:
int x;
int *p = &x;
方法二:
int x,*p;
p = &x;
其含义:定义了一个可以指向整型数据的指针变量p,并用整型变量x的地址值对指针变量p进行初始化,从而使指针变量p具体指向了整型变量a
③指针变量不能直接赋值
int *p;
p = 10010;
//这个写法错误,不能直接赋值
int i,*p,*t;
p = &i;
t = p;
//这个做法正确,间接赋值
3、间接寻址运算符
①&:获取变量的地址需要使用的取地址运算符(scanf输入需要加入取地址符&,因为scanf()函数后面的参数应该传入的是指针)
*:访问指针变量指向的变量的值的间接寻址运算符
②
*(变量名) //将变量当做地址到相应的地址取值
&(变量名) //获取变量的地址
*与&互为逆运算
*(&(变量名)) //指的是变量本身
int j;
int *k;
k = &j;//k为指向j这块变量内存的指针
③指针必须指向一块有意义的内存,不要使用未初始化的指针变量
4、按值调用与模拟按引调用
按值调用
#include <stdio.h>
void Fun(int par);//函数声明
int main()
{
int arg = 1;
printf("arg = %d\n",arg);//输出arg = 1;
Fun(arg);//调用函数,输出par = 1;
printf("arg = %d\n",arg);//在函数中,被调函数形参被赋新值,但未改变主调函数中的值
return 0;
}
void Fun(int par)
{
printf("par = %d\n",par);
par = 2;//给par赋新值
}
运行结果
arg = 1
par = 1
arg = 1
再看用指针变量作为函数形参
#include <stdio.h>
void Fun(int *par);
int main()
{
int arg = 1;
printf("arg = %d\n",arg);
Fun(&arg);//调用函数,传递变量arg的地址值给被调函数
printf("arg = %d\n",arg);//在被调函数中,指针变量指向的值被改变,输出arg = 2;
return 0;
}
void Fun(int *par)
{
printf("par = %d\n",*par);//输出形参指针变量所指的内容,par = 1;
*par = 2;//改变形参指向的变量的值
}
运行结果
arg = 1
par = 1
arg = 2
对比以上两种形参方式,发现指针变量作函数形参能改变主函数对应的实参变量的值
例如
键盘中任意输入两个整数,编程实现这两个数交换后再重新输出
第一个例子
#include <stdio.h>
void Swap(int x,int y)
int main()
{
int a,b;
scanf("%d,%d",&a,&b);
printf("\n");
Swap(a,b);
printf("%d,%d",a,b);
return 0;
}
void Swap(int x,int y)
{
int temp;
temp = x;
x = y;
y = temp;
}
输入3,5 结果如下
3,5
在被调函数里面已经交换了但在主调函数中却没有交换
用指针变量作为函数形参的例子
#incldue <stdio.h>
void Swap(int *x,int *y);
int main()
{
int a,b;
scanf("%d,%d",&a,&b);
Swap(&a,&b);
printf("%d,%d",a,b);
}
void Swap(int *x,int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
输入3,5 结果如下
5,3
这里用指针变量作为被调函数形参,在主调函数中实参值被改变
编写一个函数,计算最高分以及其相应的学生学号
void FindMax(int score[],long num[],int n,int *pMaxScore,long *pMaxNum)
{
int i;
*pMaxNum = score[0];//假设score[0]为最高分
*pMaxNum = num[0];//假设score[0]的学号为num[0]
for(i=0;i<n;i++)
{
if(score[i]>*pMaxNum)
{
*pMaxNum = score[i];
*pMaxNum = num[i];
}
}
}