魔法指针 之 指针开篇

简介: 魔法指针 之 指针开篇

指针


概念

C语言中的地址 也形象化叫做 指针,通过它能找到以它为地址的内存单元

so

内存单元的编号 == 地址 == 指针

计算机常见单位转换

常见单位:PB TB GB MB KB byte bit

     由 大------------------>小

1个字节(byte)= 8 bit

1KB = 1024 byte  

1MB = 1024 KB

1GB = 1024 MB    

1TB = 1024 GB

1PB = 1024 TB

深入理解指针

注:地址是用%p来打印的(在vs中是以十六进制打印出来的)

请看代码:

在前面学过,“ & ”该符号叫取地址操作符

int main()
{
  int a = 10;
 
  printf("%d的地址为%p\n", a, &a);
  return 0;
}

%p打印出来的十六进制随机的,取决于计算机

控制台输出

指针变量

一段代码解释清楚指针变量

int main()

{

   int a = 10;

   int* pa = &a; //取出a的地址

        //pa叫做指针变量,也叫做用来存放指针

   return 0;

}

一图 KO 理解指针类型

如上面代码👆

指针变量的大小  

请看代码

注意:%zd是打印类型的

在VS中:

x64环境下8byte  //64位平台

x86环境下4byte  //32位平台

int main()
{
  char* pc = NULL;
  int* pi = NULL;
 
  printf("%zd\n", sizeof(pc));
  printf("%zd\n", sizeof(pi));
 
  return 0;
}

结果会输出什么呢?

再看代码和结果

指针变量的大小和类型是⽆关的,

指针类型的变量,在相同的平台下,大小都是相同的。

实际上,这是vs控制的

我们再来看另一段代码

int main()
{
  int a = 10;
 
  int* pa = &a;
  char* pc = (char*)&a;
 
  printf("%p\n", pa);
  printf("%p\n", pc);
  printf("%p\n", pa+1);
  printf("%p\n", pc + 1);
 
  return 0;
}

看看结果输出

总结

  类型 字节(byte)
char* 1
short* 2
int* 4
float* 4
double* 8

解引用操作符(*)

请看代码:输出a的值是什么呢?

int main()
{
  int a = 6;
 
  int* pa = &a;
  *pa = 10;
 
  printf("%d\n", a);
  return 0;
}

代码解释

const修饰指针

const修饰变量

const修饰指针变量

const放在*左边  vs const放在*右边

const放在*两边


野指针


概念

野指针就是指针指向的位置是不可知的,野指针简称(野狗);

特点

随机的,不确定的,没有明确限制的

最常遇见野指针

指针未初始化

局部变量指针未初始化,默认为随机值

int main()
{
  int *pta;
  *pta = 10;//err
  printf("%d\n", pta);
  return 0;
}

指针越界访问

指针指向的范围超过了数组的范围,越界访问

int main()
{
  int arr[5] = { 0 };
  int* p = &arr[0];
  int i = 0;
  for (i = 0; i < 10; i++)
  {
    *p = 1;
    p++;
  }
  return 0;
}

指针指向的空间释放

举个栗子:

有三个人物:员工A,boss,宾馆,房卡682

boss预定了宾馆,给了员工房卡,让他明天去入住,但在明天前boss退房了,而员工未收到通知,员工去入住了,但在核验时发现房卡用不了

int test()
{
  int a = 10;
  //...
  return &a;
}
 
int main()
{
  int* p = test();
  printf("%d\n", *p);
  return 0;
}
目录
相关文章
|
7天前
|
存储 C++
学习——理解指针(3)
学习——理解指针(3)
|
7天前
|
编译器
学习——理解指针(2)
学习——理解指针(2)
|
7天前
|
存储
学习——理解指针(1)
学习——理解指针(1)
|
5月前
|
C++
指针(笔记2)一
本文介绍了C++中`const`关键字修饰指针的两种情况:当`const`位于星号(*)左侧时,它限制指针所指向的内容不可修改,但指针自身可变;当`const`位于星号(*)右侧时,它限制指针变量不可改变,但可通过该指针修改其指向的内容。此外,文章还讨论了指针的基本运算,包括指针加减整数(用于遍历数组),指针减指针(计算两者间元素个数)以及指针的关系运算(在循环中控制指针移动)。
37 1
|
5月前
|
存储 C语言 Perl
指针(笔记1)一
本文介绍了计算机内存和地址的基本概念。内存由存储单元组成,每个单元有唯一地址,内存地址是无符号整数。在32位系统中,地址空间为4GB。内存被划分为字节单元,每个变量在内存中占据特定长度的空间,例如字符占1字节,整型占4字节。指针是存储变量地址的变量,通过取地址操作符(&)获取变量的地址。指针变量需要先赋值才能使用,并且只能指向定义时的变量类型。
28 0
|
5月前
|
程序员 编译器 C语言
指针(笔记2)二
这篇内容主要讲解了指针和野指针的概念以及如何避免野指针的问题。野指针是指针未初始化、越界访问或指向已释放内存的情况。避免野指针的方法包括初始化指针、避免指针越界和在不再使用时将指针设为NULL。此外,文章提到了`assert`断言在调试中的作用,它可以帮助检测程序运行时的错误条件。最后,讨论了函数调用中的传值调用和传址调用,指出传址调用允许函数直接修改实参变量的值。
29 0
|
5月前
|
存储 编译器
指针(笔记1) 二
这篇内容介绍了指针的相关概念,包括解引用操作符、指针变量的大小、指针的解引用、指针加整数以及void*指针的使用。解引用操作符允许通过指针访问和修改变量,指针变量的大小取决于地址总线的宽度(32位系统为4字节,64位系统为8字节)。指针加整数时,不同类型的指针会按相应类型大小移动。void*指针可以存储任何类型的数据地址,但不能直接解引用或进行指针运算,通常用于函数参数以实现泛型编程。最后强调了指针变量应指向相同类型的变量,并在类型不匹配时进行强制转换。
30 0
|
11月前
|
C++
指针就该这么学->C指针进阶
指针就该这么学->C指针进阶
|
存储 安全 编译器
【C++初阶(三)】引用详解(对比指针)(下)
【C++初阶(三)】引用详解(对比指针)(下)