首页 > 其他分享 >【C】指针

【C】指针

时间:2024-07-25 13:27:12浏览次数:14  
标签:变量 指向 int 地址 ptr 指针

目录

定义

声明指针

地址运算符和取值运算符

初始化指针

使用指针

指针的算术操作

空指针和野指针

指针与数组

指针运算

指针与整数的加减

指针间的减法

指针比较


在C语言中,指针是一个非常重要的概念,它直接关联到内存管理和数据访问的效率。

定义

指针是内存中一个最小单元的编号,也就是地址,指针=地址

指针变量是一个用来存放内存地址的变量,通常情况下我们说指针都是指指针变量

指针变量是一个变量,其值为另一个变量的地址。换句话说,指针“指向”内存中的某个位置。在C语言中,指针通过星号(*)来声明。

声明指针

声明一个指针变量,你需要指定它将指向的数据类型。以下是声明指针的一些例子:

int *intPtr;    // 声明一个指向整数的指针
char *charPtr;  // 声明一个指向字符的指针
float *floatPtr;// 声明一个指向浮点数的指针

地址运算符和取值运算符

  • 地址运算符(&:用于获取一个变量的地址。

        在scanf函数中,&+变量 就是获取变量所存储的第一位地址,然后读取内容

  • 取值运算符(*:用于获取指针指向地址的值。
int a=7;
int* pi=a;
*pi++;    //*+指针变量可以获取指针变量所对应的变量的值

初始化指针

你可以通过地址运算符来初始化指针,使其指向一个具体的变量。

int var = 5;
int *ptr = &var; // ptr 现在指向 var 的地址

使用指针

指针可以用于访问或修改它所指向的变量的值。

printf("Value of var: %d\n", var);     // 直接访问变量
printf("Value of var via ptr: %d\n", *ptr); // 通过指针访问变量

*ptr = 10; // 通过指针修改 var 的值
printf("New value of var: %d\n", var); // 输出 10

指针的算术操作

指针可以进行一些算术操作,如增加或减少其所存储的地址值。以下是一些指针算术操作:

  • ptr++ 或 ptr += sizeof(type):将指针向前移动到下一个相同类型的数据的地址。
  • ptr-- 或 ptr -= sizeof(type):将指针向后移动到上一个相同类型的数据的地址。

空指针和野指针

  • 空指针:一个没有被初始化的指针,通常用 NULL 来初始化,表示它不指向任何地址。
int* pi=NULL;
  • 野指针:一个没有被正确初始化的指针,可能指向内存中的任意位置,使用野指针可能导致不可预测的行为甚至程序崩溃。

野指针的出现可能有三种情况:

int* p;

第一种情况:没有给定所要储存地址的变量,会随机给p分配一个地址,地址随机对应一个变量,这是定义时出现的一种错误,需要避免,因为不会有报错。

int a[5]={0};
int* p = a;
int i=0;
for(;i<=5;i++){
    *p=i;
    p++;
}

第二种情况:数组中越界,这种情况相比第一种就属于更加高级一点的错误,相对来说更隐蔽一些,需要把握好数组界限这一规则,作为写代码的注意点。

第三种情况:指针对应的变量在内存中释放了,常见于用函数返回地址给指针变量,后面函数内部内存释放(相当于是把这个内存空间的使用权限还给了操作系统,可能这个地方的值并没有发生变化)

int* test(){
    int a=10;
    return &a;
}
int main(){
    int* p = test();//test函数使用之后a就被释放了
    return 0;
}

指针与数组

指针和数组紧密相关。数组名在大多数情况下可以作为指向数组首元素的指针使用。

int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr; // 数组名 arr 可以看作指向首元素的指针

for (int i = 0; i < 5; i++) {
    printf("Value at arr[%d] = %d\n", i, *(ptr + i)); // 通过指针访问数组元素
}

指针运算

  1. 指针与整数的加减:可以将一个整数值加到指针上或从指针中减去一个整数值。这会导致指针移动到它当前指向的类型的前一个或后一个实例的位置。

  2. 指针间的减法:两个指向同一数组内元素的指针可以进行减法运算,结果是两个指针之间的元素数量。

  3. 指针比较:可以比较两个指针的值,通常用于确定一个指针是否在另一个指针之前或之后。

以下是一些具体的指针运算示例:

指针与整数的加减

int arr[5] = {10, 20, 30, 40, 50};
int *ptr = arr; // ptr 指向数组 arr 的第一个元素

ptr = ptr + 2; // ptr 现在指向 arr[2],即 30
printf("%d\n", *ptr); // 输出 30

ptr = ptr - 1; // ptr 现在指向 arr[1],即 20
printf("%d\n", *ptr); // 输出 20

指针间的减法

int *ptr1 = &arr[3];
int *ptr2 = &arr[0];

int diff = ptr1 - ptr2; // diff 现在是 3,因为 ptr1 比 ptr2 靠后 3 个整型元素
printf("Difference: %d\n", diff);

指针比较

if (ptr1 > ptr2) {
    printf("ptr1 is after ptr2 in memory\n");
} else {
    printf("ptr2 is after ptr1 in memory\n");
}

以下是关于指针运算的一些重要规则和注意事项:

  • 同一数组内的指针运算:只有当指针指向同一数组内的元素时,指针运算才是有意义的。

  • 指针类型:指针的类型决定了指针运算时移动的步长。例如,一个指向 int 类型的指针每次增加1,实际上会增加 sizeof(int) 字节。

  • 空指针和未初始化指针:对空指针(NULL)或未初始化的指针进行运算会导致未定义行为。

  • 越界访问:超出数组范围的指针运算可能会导致越界访问,这是危险的,并且可能导致程序崩溃。

  • 指针减法限制:只有当两个指针都指向同一数组内的元素时,指针间的减法才是有意义的。

  • 指针比较限制:只有当两个指针都指向同一数组内的元素时,指针的比较才是有意义的。

指针运算是C语言中一个非常强大但也容易出错的功能,因此在使用时需要格外小心。

指针也是C语言中很重要的概念,需要多去复习巩固

在写代码的时候由于基础不扎实我掉入了一个关于单双引号不同含义的坑里面

这个是我最开始写的代码,用于创建一个自己的字符统计函数(里面涉及到知识点包括字符串变量最后会有一个'\0'的字符表示终结,'\0'会占用内存;字符串传参的话传过去的实际上是第一个字符的地址,所以接受时需要用指针变量来接收),我出现的问题就是单引号实际上是表示引号里面是字符,双引号是字符串,上面的代码运行的时候它一直跟我说指针变量和一个整型不能比较,这样一个小小的问题我也是花了一点时间去检查的,把*str != "\0"中的双引号改成单引号就行了,可见基础十分重要

标签:变量,指向,int,地址,ptr,指针
From: https://blog.csdn.net/2302_81310828/article/details/140659493

相关文章

  • 翻转字符串里的单词(双指针去重思路+代码实现)
    题目①双指针思路整体思路:去重+反转数组填充类问题都可以使用双指针方式!原理如同:双指针移除元素去重其实是一种删除操作,1.双指针去重fast判断slow指向待填充位置额外再使用一个变量:isblock(判断之前是否出现过空格)连续空格的话只保留一个空格,达到去重效果遇......
  • 力扣:三数之和(左右双指针思路+动画演示+代码实现)
    题目①双指针思路(双指针匹配方式,还不涉及去重)1.需要的变量个数(三个变量,双指针作为其中两个)left、right已经两个变量,表示两个数。题目求三数之和,只需要另外一个变量i即可!所以一共是nums[i]、nums[left]、nums[right]。存储满足条件的这三个值2.双指针工作原理......
  • C语言:指针1(详细讲解)
     目录指针变量和地址取地址操作符指针变量的大小指针变量类型意义指针解引⽤指针的+-整数const修饰指针const修饰变量const修饰指针变量指针的运算指针+-整数 指针的关系运算野指针指针未初始化 指针越界访问指针指向的空间被释放了避免野指针assert......
  • c++11(3): 类型推导与智能指针
    41.两个右尖括号>在模板中不再被判定为右移,需要右移需要加圆括号()42.auto类型推导,编译时推导inta=1;autob=a;//b的类型为int1):auto不能作函数形参类型2):auto不能对结构体中的肥静态成员进行推导3):auto不能声明数组4):auto不能在实例化模板时作为......
  • C语言 ——— 函数指针数组的讲解及其用法
    目录前言函数指针数组的定义函数指针数组的使用前言数组是存放一组相同类型数据的存储空间关于指针数组的知识请见:C语言———指针数组&指针数组模拟二维整型数组-CSDN博客那么要将多个函数的地址存储到数组中,这个数组该如何定义呢?函数指针数组的定义把多个函数......
  • 深入理解指针(2)
    一、数组名的理解首先我们先做一个测试:#include"stdio.h"intmain(){ intarr[10]={1,2,3,4,5,6,7,8,9,10}; printf("&arr[0]=%p\n",&arr[0]); printf("arr=%p\n",arr); return0;}输出结果:我们发现数组名和数组首元素的地址打印出的结果一模一样,数组名......
  • 深入理解指针(3)
    一、字符指针变量字符指针变量一般用char*来表示一般使用:#include"stdio.h"intmain(){charch='w';char*pc=&ch;*pc='w';return0;}还有一种使用方法:#include"stdio.h"intmain(){constchar*pc="hellobit......
  • C++this指针--指针的介绍用法以及相关注意事项
    什么是this指针this指针是在C++中用来指向当前对象的特殊指针。它是每个非静态成员函数的隐式参数,指向调用该函数的对象。在C++类的成员函数中,除了静态成员函数外,每个成员函数都有一个隐含的this指针,它指向调用该函数的对象。这个指针可以让成员函数访问调用它的对象......
  • 【算法专题】双指针算法之611. 有效三角形的个数(力扣)
    欢迎来到CILMY23的博客......
  • 【算法专题】双指针算法之LCR 179. 查找总价格为目标值的两个商品(力扣)
     欢迎来到CILMY23的博客......