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

二、数据结构预备知识(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;
}
  • 为何指针变量要有类型: 为了确定所指向内存空间的大小,指针仅储存地址数,并不能自动地知道多少个字节作为一个变量。例如int为4个字节double为8个字节

指针与函数

#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关系的知识详见《微机原理》 ↩︎

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值