[C语言] 初识指针

简介: [C语言] 初识指针
■指针的概念
■指针的基本类型 
■野指针
■指针和数组
■二级指针
■指针运算

**

一.指针的概念

**

指针也就是内存地址,指针变量是用来存放内存地址的变量,描述了数据在内存中的位置,标示了一个占据存储空间的实体,在这一段空间起始位置的相对距离值。在 C/C++语言中,指针一般被认为是指针变量,指针变量的内容存储的是其指向的对象的首地址,指向的对象可以是变量(指针变量也是变量),数组,函数等占据存储空间的实体。

**

二.指针的基本类型

1.指针变量决定了:指针进行解引用操作时可以访问几个字节(权限)

char*: 解引用时访问一个字节

int : 解引用时访问四个字节
double
:解引用时访问8个字节

int main()
{
  int a = 0x11223344;
  int*pa = &a;
  *pa = 0;
  /*char* pc = &a;
  *pc = 0;*/
  return 0;
}

2.指针类型决定了指针的步长,及(向前,向后,走一步多大距离)

int* 指针加1,表示跳过一个整型,意思是向后走4个字节;

char指针加1,表示跳过一个字符,意思是向后走1个字节;
double
指针加1,表示跳过一个double,意思是向后走8个字节;

short*指针加1,向后走2个字节;

int main()
{
  int a = 0x11223344;
  int*  pa = &a;
  char* pc = &a;
  printf("pa=%p\n", pa);
  printf("pc=%p\n", pc);
  printf("pa+1=%p\n", pa -1);
  printf("pc+1=%p\n", pc -1);
  return 0;
}在这里插入代码片

**

三.野指针

**

野指针产生的原因(C语言中常见)

1.局部指针变量没有初始化

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

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.就是指针指向的空间未释放

常见的还有以下:

/*int main()
{
  int* p;//p就是野指针
  *p = 20;
  return 0;
}*/
int main()
{
  int arr[10] = {0};
  int i = 0;
  int sz = sizeof(arr) / sizeof(arr[0]);
  int* p = arr;
  for (i = 0; i <= sz; i++)
  {
    *p = i;
    p++;
  }
  return 0;
}

如何规避野指针

1.定义创建一个指针变量时一定要记得初始化

2.动态开辟的内存空间,free()释放内存后,一定要马上将对应的指针置为NULL空指针

3.不用再函数中返回栈空间的指针(地址)或局部变量的地址

4.注意在动态开辟内存后,对其返回值做合理判断,判断其是否为空指针

#include <stdio.h>
int main()
{
    int *p = NULL;
    //....
    int a = 10;
    p = &a;
    if(p != NULL)
   {
        *p = 20;
   }
    return 0;
}

**

四.指针和数组

首先我们以如下例子来举例:

#include <stdio.h>
int main()
{
 int arr[5] = {1,2,3,4,5};
    printf("%p\n", arr);
    printf("%p\n", &arr[0]);
    return 0;
}

运行结果如下:

我们就可以得出结论:数组就是首元素地址,数组名是数组第一个元素的地址,也是数组的首地址。

*

而以下情况除外:

1.&数组名 ----->表示的是整个数组

2.sizeof数组名 ----->计算的是整个数组的大小


五.二级指针

把一个指向指针变量的指针变量称为多级指针变量,对于指向处理数据的指针变量称为一级指针变量,简称一级指针,而把指向一级指针变量的指针变量称为二级指针变量,简称二级指针

对于二级指针的运算有:

1.*ppa 通过对ppa中的地址进行解引用,这样找到的是 pa , *ppa 其实访问的就是 pa .

int b = 10;
*ppa = &b;//等价于 pa = &b;

2.**ppa 先通过 *ppa 找到 pa ,然后对 pa 进行解引用操作: *pa ,那找到的是 a .

**ppa = 10;
//等价于*pa = 10;
//等价于a = 10;

六.指针运算

有下三种情况:

指针± 整数

指针-指针

指针的关系运算

6.1 指针±整数

#include <stdio.h>  
  
int main()  
{  
    int arr[10] = {1,2,3,4};  
    int *p = arr;  
    *p = 10;
    printf("%d\n",*p);  
    p++;
    *p = 20;  
    printf("%d\n",*p); 
 
    return 0;  
}

结果为:

6.2指针-指针

int main()
{
  //两个指针相减的前提是:指针指向的同一块连续的空间
  int arr[10] = {0};
  printf("%d\n", &arr[9] - &arr[0]);
  printf("%d\n", &arr[0] - &arr[9]);
  int a = 10;
  char c = 'w';
  printf("%d\n", &a - &c);//err
  return 0;
}

6.3指针的关系运算

for(vp = &values[N_VALUES-1]; vp >= &values[0];vp--)
{
    *vp = 0;
}

实际在绝大部分的编译器上是可以顺利完成任务的,然而我们还是应该避免这样写,因为标准并不保证它可行。

总结:指针可以相减,也可以和立即数加或者减,两个指针相减可以理解为两个指针的距离,但是两个指针相加后将会是一个毫无意义的地址。最后,希望对大家有所帮助!

相关文章
|
3月前
|
C语言
【c语言】指针就该这么学(1)
本文详细介绍了C语言中的指针概念及其基本操作。首先通过生活中的例子解释了指针的概念,即内存地址。接着,文章逐步讲解了指针变量的定义、取地址操作符`&`、解引用操作符`*`、指针变量的大小以及不同类型的指针变量的意义。此外,还介绍了`const`修饰符在指针中的应用,指针的运算(包括指针加减整数、指针相减和指针的大小比较),以及野指针的概念和如何规避野指针。最后,通过具体的代码示例帮助读者更好地理解和掌握指针的使用方法。
62 0
|
1月前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
84 3
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
1月前
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
54 9
|
1月前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
45 7
|
2月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
151 13
|
2月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
2月前
|
算法 C语言
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
128 3
|
2月前
|
存储 C语言 开发者
C 语言指针与内存管理
C语言中的指针与内存管理是编程的核心概念。指针用于存储变量的内存地址,实现数据的间接访问和操作;内存管理涉及动态分配(如malloc、free函数)和释放内存,确保程序高效运行并避免内存泄漏。掌握这两者对于编写高质量的C语言程序至关重要。
62 11
|
2月前
|
存储 算法 程序员
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。
|
2月前
|
程序员 C语言
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门。本文深入探讨了指针的基本概念、声明方式、动态内存分配、函数参数传递、指针运算及与数组和函数的关系,强调了正确使用指针的重要性,并鼓励读者通过实践掌握这一关键技能。
44 1