指针相关概念说明

指针相关理解

基本介绍

  1. 指针是C语言的精华, 也是C语言的难点。
  2. 指针, 也就是内存的地址; 所谓指针变量, 也就是保存了内存地址的变量。 关于指针的基本使用, 在讲变量的时候做了入门级的介绍
  3. 获取变量的地址, 用&, 比如: int num = 10, 获取num的地址: &num
  4. 指针类型, 指针变量存的是一个地址, 这个地址指向的空间存的才是值比如: int *ptr = & ptr 就是指向 int 类型的指针变量, 即 ptr 是 int * 类型。
  5. 获取指针类型所指向的值, 使用: (取值符号), 比如: int * ptr , 使用ptr获取ptr指向的值

什么是指针

指针是一个变量,其值为另一个变量的地址(前示意图已经说明), 即,内存位置的直接地址。就像其他变量或常量一样,在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:

int *ip; /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch; /* 一个字符型的指针 */

指针的算术运算

指针是一个用数值表示的地址。 可以对指针执行算术运算。 可以对指针进行四种算术运算: ++--+-

测试案例1.

//@author:five-five
#include "stdio.h"

int main() {
    int nums[] = {1, 2, 3, 4};
    int *point01 = (int *) &nums;
    printf("-----------------------int`s point test starting----------------------------\n");
    printf("%p\n", point01);
    printf("%p\n", ++point01);
    printf("%i\n", *point01);
    printf("%i\n", *++point01);
    return 0;
}

在这里插入图片描述

结论:

  1. 数组在内存中是连续分布的
  2. 当对指针进行++时, 指针会按照它指向的数据类型字节数大小增加, 比如 int *指针, 每++ , 就增加4个字节(win10)

测试案例2.

int main () {
  int var[] = {10, 100, 200};
  int i, *ptr;
  ptr = var;
  ptr += 2; //直接加2*sizeof(int)个字节
  printf("var[2]=%d var[2]的地址=%p ptr=%p ptr指向的地址的内容=%d",
  var[2], &var[2], ptr, *ptr);
  return 0;
}
int main ()
{
  int var[] = {10, 100, 200, 400, 9, 12};
  int i, *ptr;
  ptr = &var[2]; // ptr 指向了 第3个元素
  ptr -= 2;
  printf("ptr指向的值=%d", *ptr); // 10
  return 0;
}

指针的比较

//@author:five-five
#include "stdio.h"

int main() {
int var[]={10, 100, 200};
    int *ptr;
    ptr = var;//ptr 指向var 首地址(第一个元素)
    if(ptr == var[0]) {//错误,类型不一样
        printf("ok1");
}
//指针进行比较
    if(ptr == &var[0]) {// 可以
        printf("\nok2"); //输出
}
//数组的地址是首位元素的地址
    if(ptr == var) {//可以
        printf("\nok3"); //输出
}
if(ptr >= &var[1]) {//可以比较,但是返回false
        printf("\nok4");//不会输出
}
return 0;
}
//@author:five-five
#include "stdio.h"

const int MAX = 3;

int main() {
    int var[] = {10, 100, 200};
    int i, *ptr;
    ptr = var;
    i = 0;
    while (ptr <= &var[MAX - 2])//&var[1]
    {
        printf("Address of var[%d] = %x\n", i, ptr);
        printf("Value of var[%d] = %d\n", i, *ptr);
        ptr++;
        i++;
    } //会输出 10 , 100
    return 0;
}

指向指针的指针(多重指针)

多重指针介绍

  1. 一个指向指针的指针变量必须如下声明,即在变量名前放置两个星号。例如,下面声明了一个指向 int 类型指针的指针:int **ptr; // ptr 的类型是 int **
  2. 当一个目标值被一个指针间接指向到另一个指针时,访问这个值需要使用两个星号运算符, 比如 **ptr

代码示例

#include "stdio.h"

int main() {
    int var;
    int *ptr;//一级指针
    int **pptr;//二级指针
    int ***ppptr;//三级指针

    var = 3000;
    ptr = &var;//var 变量的地址赋给 ptr
    pptr = &ptr;//ptr 变量的地址赋给 pptr
    ppptr = &pptr;//pptr 变量的地址赋给 ppptr

    printf("var的值:\t%i\n", var);
    printf("var的指针:\t%p\n", &var);

    printf("prt的指针:\t%p\n", &ptr);
    printf("prt的指向指针:\t%p\n", ptr);

    printf("pprt的指针:\t%p\n", &pptr);
    printf("pprt的指向指针:\t%p\n", pptr);

    printf("ppprt的指针:\t%p\n", &ppptr);
    printf("ppprt的指向指针:\t%p\n", ppptr);

    return 0;
}

结果如图

指针使用注意事项和细节

变量定义类型表示含义
int iint定义整型变量
int *pint *定义p为指向整型数据的指针变量
int a[5]int [5]定义整型数组a,它有5个元素
int * p[4]int * [4]定义指针数组p,它有4个指向整型数据的指针元素组成
int(* p)[4]int( * )[4]p为指向包含4个元素的一维数组的指针变量
int f()int()f为返回整型函数值的函数
int *p()int *()p为返回一个指针的函数,该指针指向整型数据
int (* p)()int (*)()p为指向函数的指针,该函数返回一个整型
int **pint **p是一个指针变量,它指向一个指向整型数据的指针变量
void *pvoid *p是一个指针变量,其类型为void(空类型),不指向具体的对象
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

five-five

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值