指针初步讲解(上)

简介: 指针初步讲解(上)

指针

本章小编偷个懒,把md文档导入了哈哈哈!

1.指针基本理解

1.1指针理解的2个要点:
  1. 指针是内存中一个最小单元的编号,也就是地址。
  2. 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量。

总结:指针就是地址,口语中说的指针通常指的是指针变量。

3.指针变量

我们可以通过**&(取地址操作符)**取出变量的内存其实地址,把地址可以存放到一个变量中,这个

变量就是指针变量

#include <stdio.h>
int main()
{
 int a = 10;//在内存中开辟一块空间
 int *p = &a;//这里我们对变量a,取出它的地址,可以使用&操作符。此处*定义指针变量p
   //a变量占用4个字节的空间,这里是将a的4个字节的第一个字节的地址存放在p变量
//中,p就是一个之指针变量。
 return 0;
}

总结:

指针变量,用来存放地址的变量。(存放在指针中的值都被当成地址处理)。

指针是用来存放地址的,地址是唯一标示一块地址空间的。

指针的大小在32位平台是4个字节,在64位平台8个字节

2. 指针和指针类型

2.1指针类型

我们都知道,变量有不同的类型,整形,浮点型等。那指针有没有类型呢?

准确的说:有的。

当有这样的代码:

int  num=10;
p=&num

要将&num(num的地址)保存到p中,我们知道p就是一个指针变量,那它的类型是怎样的呢?

我们给指针变量相应的类型。

char  *pc = NULL;
int  *pi = NULL;
short *ps = NULL;
long  *pl = NULL;
float *pf = NULL;
double *pd = NULL;
......

这里可以看到,指针的定义方式是: type + * 。

其实:

char* 类型的指针是为了存放 char 类型变量的地址。

short* 类型的指针是为了存放 short 类型变量的地址。

int* 类型的指针是为了存放 int 类型变量的地址。

2.2指针类型的影响
2.2.1 指针±整数
#include <stdio.h>         
                         
int main()
{
 int n = 10;
 char *pc = (char*)&n;
 int *pi = &n;
 printf("%p\n", &n);       
 printf("%p\n", pc);
 printf("%p\n", pc+1);
 printf("%p\n", pi);
 printf("%p\n", pi+1);
 return  0;
}
运行结果:
000000000065FE0C
000000000065FE0C
000000000065FE0D
000000000065FE0C
000000000065FE10

**总结:**指针的类型决定了指针向前或者向后走一步有多大(距离)。

2.2.2指针的解引用
#include <stdio.h>
int main()
{
 int n = 0x11223344;
 char *pc = (char *)&n;
 int *pi = &n;
 *pc = 0;  //重点在调试的过程中观察内存的变化。
 *pi = 0;  //重点在调试的过程中观察内存的变化。
 return 0;
}
#include <stdio.h>
int main()
{
    int n = 0x11223344;        // 初始化一个整数变量n
    char *pc = (char *)&n;     // 将n的地址强制转换为字符类型指针并赋值给pc
     
    *pc = '0';                   // 将pc指向的地址的值设为0
    printf("%c", *pc);         // 打印修改后的字符,使用正确的%c格式说明符
    printf("%c", n)   ;      // 打印变量n的值
    int *pd=&n;
    *pd=1;            //此时*解引用
    printf("%d",n);
    return 0;
}运行结果:001

总结:

指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。

比如: char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。

3.野指针

概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

3.1 野指针成因
3.1.1指针未初始化
#include <stdio.h>
int main()
{ 
 int *p;//局部变量指针未初始化,默认为随机值
 *p = 20;
 return 0;
}
3.1.2指针越界访问
#include <stdio.h>
int main()
{ int arr[10] = {0};
   int *p = arr;
   int i = 0;
   for(i=0; i<=11; i++){
   //当指针指向的范围超出数组arr的范围时,p就是野指针
   *(p++) = i;
  }
   return 0;
}
3.1.3指针指向的空间释放
#include <stdio.h>
int* test()
{
 int n = 100;
 return &n;
}
int main()
{
 int*p = test();
 printf("%d\n", *p);
 return 0;
}

函数结束后,申请的空间还给操纵系统了,p指针就会进行非法访问,成为了野指针。

指针初步讲解(下):https://developer.aliyun.com/article/162436

目录
相关文章
|
7月前
|
存储 C语言
指针详解(3)
指针详解(3)
|
7月前
|
存储 程序员 C++
c++指针
c++指针
36 0
|
7月前
|
编译器
深入理解指针(2)
深入理解指针(2)
43 2
|
6月前
|
C++
C++指针
C++指针
|
7月前
|
存储 C语言
c 指针
c 指针
44 0
|
7月前
|
存储 C++
19指针
19指针
33 0
|
7月前
指针(3)
指针(3)
30 0
|
7月前
|
存储 人工智能 大数据
C++017-C++指针及其应用
C++017-C++指针及其应用
|
7月前
|
存储
浅谈指针(1)
浅谈指针(1)
|
存储
指针的使用
指针的使用
51 0