二、数据结构预备知识(1)——指针


前言

本系列文章是基于郝斌《数据结构入门》教学视频的笔记,如有不妥之处欢迎指正


 

目录

  • 前言
  • 指针的重要性
  • 指针相关定义
  • 指针与函数
  • 数组与指针
    • 数组元素与内存地址的关系
    • 数组与指针的关系
    • 数组、指针、函数

 


指针的重要性

  • 指针是C语言的灵魂

指针相关定义

  • 地址:是内存单元的编号(16进制数),是从0开始的非负整数,其范围(32位CPU)为0——FFFFFFFFH(0——4GB-1)1
  • 指针:指针就是地址,地址就是指针
  • 指针变量:存放内存地址的变量,均占4个字节的空间
  • 指针的本质:指针是一个操作受限的非负整数(不能加、乘、除,仅能在某些情况下相减)
  • 内存分配:操作系统将内存的使用权限给予程序
  • 内存释放:操作系统回收该部分内存的使用权限,但是但是并不会清空内存中的遗留数据
#include<stdio.h>
int main()
{
    int *p;
    int i=10;//p是个指针变量
    		 //int *表示该p变量只能存储int类型的地址
    int j;
    
    p = &i;  //将i的地址传递给p
    p = 10;  //错误,编号为10的地址不一定是系统分配给程序的存空间,将会导致程序崩溃
    j=*p;    //等价于j = i
    
    return 0;
}

指针与函数

#include<stdio.h>
void f(int *p)//不是定义了一个名字叫做*p的形参
              //而是定义了一个形参,该形参的名字叫做p,他的类型是 int *
{
    *p = 100;
}

int main()
{
   int i = 9;

   f(&i);     //i的地址发送给p
              //&叫做取地址符

   printf("i = %d",i);
   
    return 0;
}

以上程序的输出结果为

i = 100


数组与指针

数组元素与内存地址的关系

  • 一个数组的元素在内存中一定是连续存放的
#include<stdio.h>
int main()
{
   int a[5]={1,2,3,4,5};

   printf("%p\n",a);    //%p表示输出该变量的内存地址
   printf("%p\n",a+1);
   printf("%p\n",a+2);
   printf("%p\n",a+3);
   printf("%p\n",a+4);
   
   return 0;
}

程序运行的结果为

000000000061FE00
000000000061FE04
000000000061FE08
000000000061FE0C
000000000061FE10

可以看出数组的内容在内存中是连续存放的(int 型变量占用4个字节)


数组与指针的关系

  • 一维数组名存放的是数组的第一个元 素的地址即一维数组名是个指针常量
  • 数组下标与指针的关系

a[i] <<==>> *(a+i)

#include<stdio.h>
int main()
{
    int a[5]={1,2,3,4,5};

    printf("%d\n",*a+1);  //*a+1等价于a[0]+1
    printf("%d\n",*(a+2));
    
    return 0;
}

输出结果为

2
3


数组、指针、函数

  • 通过被调函数(f())修改主调函数(main())中一维数组的内容
#include<stdio.h>
void f(int *p,int len)
{
    p[2] = -1; //p[0] == *p
               //p[2] == *(p+2) == *(a+2) == a[2]
               //此处不能用a[]因为a这个变量并不在本函数内
               //p[i]就是主函数的a[i]
}

int main()
{
    int a[5]={1,2,3,4,5};
    
    f(a,5);    //a等价于&a[0], &a[0]本身就是 int *类型
    
    printf("%d",a[2]);
    
    return 0;
}

输出结果为

-1


  1. 关于内存和CPU关系的知识详见《微机原理》 ↩︎

版权声明:本文为wuchangjian原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/wuchangjian/p/14320496.html