04-1 指针是什么

一、指针概述

1、什么是指针:

  • 指针是一个变量,值为另外一个变量的地址值(内存地址值)
  • 指针就像其他变量或常量一样,在使用之前必须对指针进行声明。
  • 使用连字号(&)获取地址值:
int var1;char avr2;
printf("var1地址值:%p\n",&var1);//输出var1的地址值
printf("var2地址值: %p\n",&var2);//输出var2的地址值

2、指针声明:

  • type * var-name;
  • type:C的数据类型
  • var-name:指针的变量名称
  • *:用于指定一个变量是指针

3、如何使用指针:

指针的操作一般有:

  • 定义一个指针变量,
  • 把变量地址复制给指针,
  • 访问指针变量中可用的地址值
#include <stdio.h>

/**
 * 指针的使用
 */
int main(){

    int var =20;
    int *ip;

    ip =&var;

    printf("获取到var的地址值是: %d\n",&var);
    printf("指针ip对应的地址值是:%d\n",ip);
    printf("指针ip对应的值是:%d \n",*ip);


    return 0;
}

输出:

获取到var的地址值是: 1422191128 
指针ip对应的地址值是:1422191128 
指针ip对应的值是:20 

4、null指针

  • 赋值为null值的指针称为空指针;

如:

  • int *ip=null;//赋值为空指针
  • if(ip):判断指针ip是否为空指针
  • if(!ip):判断指针ip是否为非空指针

二、指针的算术运算

c指针是用一个数值表示的地址,因此可以对指针执行算术运算:++,–,+,-

例如:

1、ptr指针是一个指向地址1000的整型指针,是一个32位的整数

  • ptr++;
  • 执行完成以后ptr将指向1004:因为ptr没增加一次它将指向下一个整数位置,即当前位置的往后移4个字节。这个运算会在不影响内存位置中实际值的情况下移动指针到下一个内存位置。

2、如果指针ptr指向一个地址为1000的字符

  • ptr++;
  • 执行运算后指针会指向位置1001,因为下一个字符位置是在1001.

1、递增指针:

一般会使用指针代替数组,因为指针可以递增,数组不能递增,因为数组是一个常量指针。

#include <stdio.h>

/**
 * 指针的运算
 */
int main(){

    int max =3;
    int x, *ptr;
    int var[] ={10,100,200};
        ptr = var;
    for ( x; x < max; ++x) {
        printf("指针中储存地址:var[%d]=%d \n",x,ptr);//获取到指针中储存的地址值
        printf("指针中储存的值:var[%d]=%d \n",x,*ptr);//获取指针对应的值
        ptr++;
    }

    return 0;
}
  • 输出:
指针中储存地址:var[0]=1471420940 指针中储存的值:var[0]=10 指针中储存地址:var[1]=1471420944 指针中储存的值:var[1]=100 指针中储存地址:var[2]=1471420948 指针中储存的值:var[2]=200 

2、递减指针:递减方式遍历

3、指针比较

  • 指针可以用关系运算符比较如:==,<,>
  • 采用while方式循环

三、指针数组:

声明语法: int * ptr[MAX]

  • 如:
#include <stdio.h>

/**
 * 指针数组:
 * 1、指针数组赋值:只能为数组地址值
 * 2、指针数组遍历
 */
void main(){

    int  max =3;
    int var[] = {10,100,200};
    int *ptr[max];

    // 给指针数组赋值
    for (int x = 0; x < max; ++x) {
        ptr[x] = &var[x];
    }

    for (int y = 0; y < max; ++y) {
        printf("指针数组ptr[%d]对应的地址值是:%d \n",y,ptr[y]);
        printf("指针数组ptr[%d]对应的值是:%d \n",y,*ptr[y]);
    }

}
  • 输出:
指针数组ptr[0]对应的地址值是:1455643144 指针数组ptr[0]对应的值是:10 指针数组ptr[1]对应的地址值是:1455643148 指针数组ptr[1]对应的值是:100 指针数组ptr[2]对应的地址值是:1455643152 指针数组ptr[2]对应的值是:200 

四、指向指针的指针

  • 是一种多级间接寻址的形式,也可以说是一个指针链。
  • 一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际位置。

语法: int **var;

#include <stdio.h>

void main(){

    int var, *ptr, **pptr;

    var =300;
    ptr = &var;
    pptr = &ptr;

    printf("获取var的地址值:%d \n",&var);
    printf("获取指针ptr的值:%d \n",*ptr);
    printf("获取指针ptr的地址值:%d \n",ptr);
    printf("获取指针pptr的值:%d \n",**pptr);
    printf("获取指针pptr的地址值:%d \n",pptr);

}

执行结果:

获取var的地址值:1440561692 获取指针ptr的值:300 获取指针ptr的地址值:1440561692 获取指针pptr的值:300 获取指针pptr的地址值:1440561680 

猜你喜欢

转载自blog.csdn.net/qq_34231253/article/details/78996298