指针基础(一)

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];
            }
      }
}
上一篇:(简单)华为Nova3 PAR-AL00的USB调试模式在哪里开启的步骤


下一篇:POJ 1611---The Suspects(并查集)