指针初识总结(上)

简介: 指针初识总结

目录

一.什么是指针

二.指针和指针类型

1.指针类型

2.指针的定义

3.解引用运算符:*

4.指针类型的意义

         (1).访问字节的大小

         (2).指针加减整数时位移的大小

 5.野指针(是错误的指针用法)

野指针成因

三.指针的运算

 1. 指针+-整数

 2.指针减去指针  

应用

 3.指针的关系运算

四. 指针与数组

 1.数组名是什么?

数字组可通过指针来访问

五. 二级指针

五.指针数组

一.什么是指针

  在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(pointers to)存在电脑储存器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。

#include<stdio.h>
int main()
{
  int a = 3;   //在内存中开辟一片空间
  int* p = &a;//对变量a进行取地址,可以使用&操作符
              //将a的地址存在p里面,则p就是一个指针变量
  return 0;
}

总结:指针就是地址,地址就是指针

二.指针和指针类型

1.指针类型

          变量有不同类型,当然指针也有不同类型,比如:整型指针,浮点型指针等

2.指针变量的定义

指针的定义形式如:数据类型*指针名;例如:

//分别定义了char,int,short,double类型的指针变量
char* a;
int* b;
short* c;
double* d;

3.解引用运算符:*

解引用运算符 * 可将存在某地址中的信息取出来

#include<stdio.h>
int main()
{
  int a = 30;
  int* p = &a;
  printf("%p\n", p);
  printf("%d\n", *p);//此处的*p就使用了解引用操作
}

结果

image.png

使用此操作符,将存在地址p中的30取了出来

4.指针类型的意义

让我们看一下下面几段代码及结果

#include<stdio.h>
int main()
{
  printf("%d\n", sizeof(char*));
  printf("%d\n", sizeof(short*));
  printf("%d\n", sizeof(int*));
  printf("%d\n", sizeof(double*));
  return 0;
}

结果

image.png

#include<stdio.h>
int main()
{
  int a = 3;
  char* pa = &a;
  int* pc = &a;
  printf("%p\n", pa);
  printf("%p\n", pc);
  printf("%p\n", pb);
  printf("%p\n", pd);
  return 0;
}

结果

image.png

    通过两组代码及结果看出,不同类型的指针所执行出来的结果相同。看似不同类型指针的意义   相同,但其实不是这样的,下面让我们看看不同类型指针的意义。

         (1).访问字节的大小

使用int*指针

#include<stdio.h>
int main()
{
  int a = 0x11223344;
  int* p = &a;
  *p = 0;
}

image.png

若使用char*

#include<stdio.h>
int main()
{
  int a = 0x11223344;
  char* p = &a;
  *p = 0;
}

image.png

结论:指针类型决定了指针进行解引用操作的时候,能够访问空间的大小

int* p;*p能够访问4个字节

char* p;*p能够访问1个字节

double* p;*p能够访问8个字节

(2).指针加减整数时位移的大小

#include<stdio.h>
int main()
{
  int a = 0x11223344;
  int* pa = &a;
  char* pc = &a;
  printf("%p\n", pa);
  printf("%p\n", pa+1);
  printf("%p\n", pc);
  printf("%p\n", pc+1);
  return 0;
}

image.png

结论


指针类型决定了,指针走一步走多远(指针的步长)


int*p;  p+1走向后4个字节


char*p;p+1向后走1个字节


double*平;p+1向后走8个字节


5.野指针(是错误的指针用法)

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

野指针成因

      1,指针未初始化

#include<stdio.h>
int main()
{
  int* a;//局部变量未初始化,默认为随机
  *a = 20;
  return 0;
}

   2,指针越界访问

#include<stdio.h>
int main()
{
  int arr[10] = { 0 };
  int* p = arr;
  int i = 0;
  for (i = 0; i < 12; i++)//当i>10后就会发生指针越界,出现野指针;
    p++;
}

3,指针指向的的空间释放

#include<stdio.h>
int* test()
{
  int a = 10;
  return &a;
}
//当出test这个函数后在函数内部的函数就会被销毁。
int main()
{
  int* p = test();
  *p = 20; //要访问的空间已被销毁,会随机产生地址,出现野指针
  return 0;
}

   如何避免野指针

            1.指针初始化

            2.小心指针越界

            3.指针指向空间释放即使置为空

            4.指针使用之前检查指针检查有效性

三.指针的运算

   1. 指针+-整数

例子:

#include<stdio.h>
int main()
{
  int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
  int i = 0;
  int* p = &arr;
  int sz = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数
  for (i = 0; i < sz; i++)
  {
    printf("%d  ", *p);
    p++;                      //每次指针加1
  }
}

结果:

image.png

减法同理

相关文章
|
程序员 C语言
C 指针
C 指针。
29 0
|
5月前
|
存储 编译器 C++
C++中的指针
C++中的指针
29 1
|
6月前
|
存储 数据处理 C++
C++中的指针:深入理解与应用
C++中的指针:深入理解与应用
|
6月前
|
存储 C++
|
6月前
|
存储 C语言
c 指针
c 指针
39 0
|
11月前
|
C++
c++ 加强指针理解
c++ 加强指针理解
35 1
|
Perl
C指针(详解)
C指针(详解)
175 0
|
编译器 C语言
13.指针
13.指针
91 0
C++ 指针篇
指针大小:32位操作系统中指针占4个字节; 64位操作系统中指针占8个字节
140 0