精华内容
下载资源
问答
  • C语言双指针

    2021-01-25 10:21:41
    #C语言双指针# 标题 双指针又叫二重指针,常常用于解决在不开辟额外内存空间的情况下交换数组或字符串中元素的相对位置的问题。

    标题C语言双指针

    双指针又叫二重指针,常常用于解决在不开辟额外内存空间的情况下交换数组或字符串中元素的相对位置的问题。
    这些是我目前为止遇到的双指针用法:
    1.可以用来原地修改字符串。(两个指针的运动方向相反)
    编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
    输入:[“h”,“e”,“l”,“l”,“o”]
    输出:[“o”,“l”,“l”,“e”,“h”]
    解题思路:对于长度为 n 的待被反转的字符数组,我们可以观察反转前后下标的变化,假设反转前字符数组为 s[0] s[1] s[2] … s[n - 1],那么反转后字符数组为 s[n - 1] s[n - 2] … s[0]。比较反转前后下标变化很容易得出 s[i] 的字符与 s[n - 1 - i] 的字符发生了交换的规律,因此我们可以得出如下双指针的解法:
    将数组元素从第一个开始,分别与结尾相当应的元素交换,直到中间位置,返回交换后的数组即可。

    void reverseString(char* s, int sSize)
    {
        char tmp;
        for(int i=0;i<sSize/2;i++)
        {
            tmp=s[i];
            s[i]=s[sSize-i-1];
            s[sSize-i-1]=tmp;
        }
    }
    

    2.两个指针运动方向相同。
    给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间。
    给定 nums = [3,2,2,3], val = 3。
    函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
    解题思路:我们可以使用快慢指针来解决,先从数组第一个元素开始,当该元素与指定的要删除的元素不同时,快指针继续向前,而慢指针将该元素赋值给该数组(此时它们的下表变化是不相同的),将该数组中的每个元素分别与要删除的元素比较完后,返回重新赋值后的数组即可。

    int removeElement(int* nums, int numsSize,int val) {
        int i = 0 , size = 0;
        for (int i = 0; j < numsSize; j++) {
            if (nums[i] != val) {
                nums[size++] = nums[i];
            }
        }
        return size;
    }
    
    展开全文
  • C语言双指针的使用

    2019-05-23 10:11:50
    实际应用中常用作函数参数,通过使用双指针改变实参的值(常用于字符串)。 实例如下: #include <stdio.h> #include <stdlib.h> #include "string.h" #include "cJSON.h" #include "test.h" void ...

    数指针,也叫二重指针。

    实际应用中常用作函数参数,通过使用双指针改变实参的值(常用于字符串)。

    实例如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include "string.h"
    #include "cJSON.h"
    #include "test.h"
    
    void set(char **a)
    {
        char * b = (char*)malloc(sizeof(char)*10); //必须采用动态分配的方式
    
        strcpy(b,"ABC");
    
        *a = b;
    }
    
    int main()
    {
        char * a = 0; //此处不需要分配空间
    
        set(&a);
        printf("%s\n",a);
    
        free(a); //使用完毕后,需要释放内存空间
    
        return 0;
    }
    

     输出为:

    ABC

     

    展开全文
  • C语言双指针的常见用法

    万次阅读 2018-06-01 11:42:25
    鉴于工作经验有限,目前遇到的双指针的用法有如下几种情况,后续工作中如发现有其他的用法,会更新上去。1、用作函数的返回值,比较常见的是返回分配的堆内存地址。下面用一个例子进行说明下:[cpp] view plain ...

    鉴于工作经验有限,目前遇到的双指针的用法有如下几种情况,后续工作中如发现有其他的用法,会更新上去。

    1、用作函数的返回值,比较常见的是返回分配的堆内存地址。

    下面用一个例子进行说明下:

    [cpp]  view plain  copy
    1. /*****************************************************************************/  
    2. /** 
    3. * \brief       分配指定大小size的堆空间 
    4. * \param[out]  pst      分配的内存的地址 
    5. * \param[in]   size     需要分配的内存大小 
    6. * \return      返回值描述 
    7. * \remarks     其它信息 
    8. ******************************************************************************/  
    9. bool get_memory(char *pst, unsigned int size)  
    10. {  
    11.     if (0 == size)  
    12.     {  
    13.         pst = NULL;  
    14.         return false;  
    15.     }  
    16.   
    17.     pst = (char*)malloc(size);  
    18.     if (NULL == pst)  
    19.     {  
    20.         return false;  
    21.     }  
    22.     memset(pst, 0, size);  
    23.   
    24.     return true;  
    25. }  
    26.   
    27. int use_get_memory()  
    28. {  
    29.     char *pStr = NULL;  
    30.     char buf[] = "hello world.";  
    31.     get_memory(pStr, 1024);  
    32.   
    33.     memcpy(pStr, buf, sizeof(buf));  
    34.   
    35.     return 0;  
    36. }  
    当我们运行这段程序的时候,会发现程序崩溃了,出错的原因是对内存的非法访问,为什么会出现这种情况呢,我们明明已经分配了内存的啊,那我们就进行调试一下,看看问题究竟出现在哪里,vs的调试截图如下:

    发现调用get_memory函数之后,pStr所指向的内存竟然是空的,可见问题就出现在这里。

    函数参数的传递是按值传递的,指针类型的参数其实也是按值进行传递的,只不过传递的是变量的地址,按值传递会进行拷贝,下面用一个图进行解释。

    调用get_memory后,pStr参数会进行拷贝传给get_memory,这里假设拷贝之后的参数为_pStr,执行malloc之后,_pStr指向的是分配的堆空间,而pStr指向的仍然是NULL,所以使用pStr进行操作的时候,会报内存非法访问的错误,而此时,get_memory返回后,新分配的内存(_pStr所指向的空间)没发使用,还会导致内存泄露。

    正确的用法为

    [cpp]  view plain  copy
    1. /*****************************************************************************/  
    2. /** 
    3. * \brief       分配指定大小size的堆空间 
    4. * \param[out]  pst      分配的内存的地址 
    5. * \param[in]   size     需要分配的内存大小 
    6. * \return      返回值描述 
    7. * \remarks     其它信息 
    8. ******************************************************************************/  
    9. bool get_memory(char **pst, unsigned int size)  
    10. {  
    11.     if (0 == size)  
    12.     {  
    13.         pst = NULL;  
    14.         return false;  
    15.     }  
    16.   
    17.     (*pst) = (char*)malloc(size);  
    18.     if (NULL == *pst)  
    19.     {  
    20.         return false;  
    21.     }  
    22.     memset(*pst, 0, size);  
    23.   
    24.     return true;  
    25. }  
    26.   
    27. int use_get_memory()  
    28. {  
    29.     char *pStr = NULL;  
    30.     char buf[] = "hello world.";  
    31.   
    32.     if (get_memory(&pStr, 1024) == false)  
    33.     {  
    34.         return -1;  
    35.     }  
    36.     memcpy(pStr, buf, sizeof(buf));  
    37.   
    38.     printf("%s\n", pStr);  
    39.   
    40.     free(pStr);  
    41.     pStr = NULL;  
    42.   
    43.     return 0;  
    44. }  


    传入的是pStr的地址,进入函数后进行解引用操作,就是对pStr实际地址进行操作。


    2、用于申请动态一维数组,只是这个一维数组中存储的是指针类型。

    一维数组中的每个指针又可以动态分配一个一维数组,即最终可以形成一个二维数组。

    [cpp]  view plain  copy
    1. int** array_init(unsigned int size)  
    2. {  
    3.     int **ppArray = NULL;  
    4.     if (0 == size)  
    5.     {  
    6.         return NULL;  
    7.     }  
    8.   
    9.     ppArray = (int**)malloc(sizeof(int*) * size);  
    10.     if (ppArray == NULL)  
    11.     {  
    12.         return NULL;  
    13.     }  
    14.     memset(ppArray, 0, sizeof(int*) * size);  
    15.   
    16.     return ppArray;  
    17. }  
    18.   
    19. void use_array()  
    20. {  
    21.     int **ppArr = NULL;  
    22.     int i = 0;  
    23.     ppArr = array_init(10);  
    24.       
    25.     int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };  
    26.     for (i = 0; i < 10; i++)  
    27.     {  
    28.         ppArr[i] = &array[i];  
    29.     }  
    30.   
    31.     for (int i = 0; i < 10; i++)  
    32.     {  
    33.         printf("%d\n", *(int*)(ppArr[i]));  
    34.     }  
    35.   
    36. }  

    3、表示指针的地址,即指向指针的指针。

    这里举个双向队列TAILQ的结构定义中使用的双指针。

    [cpp]  view plain  copy
    1. #define TAILQ_ENTRY(type)                        \  
    2. struct {                                \  
    3.     struct type *tqe_next;    /* next element */            \  
    4.     struct type **tqe_prev;    /* address of previous next element */    \  
    5. }  
    这是TAILQ对两个指向前后两个元素指针的抽象,抽象为TAILQ_ENTRY结构体:tqe_next是指向下一个元素的指针,tqe_prev是一个二级指针,指针变量的地址,是前一个元素的tqe_next的地址,解引用(*tqe_prev)之后就是本元素的内存地址。
    展开全文
  • char* reverseString(char* str) { if(str == NULL) return NULL; char* left = str; char* right = str + strlen(str) - 1; while(left < right) { char tmp = *lef...
    char* reverseString(char* str)
    {
        if(str == NULL)
            return NULL;
    
        char* left = str;
        char* right = str + strlen(str) - 1;
        
        while(left < right)
        {
            char tmp = *left;
            *left = *right;
            *right = tmp;
            left++;
            right--;
        }
        return str;
    }

     

    展开全文
  • 算法 | 双指针套路总结 - 知乎 (zhihu.com) ...双指针是一种思想,一种技巧或一种方法,并不是什么特别具体的算法,在二分查找等算法中经常用到这个技巧。具体就是用两个变量动态存储两个或多个结点,..
  • //快指针,原数组的索引 int i = 0;//慢指针,删去空格后数组的索引 while (s[j] != '\0') { if ( s[j] != ' ') { s[i++] = s[j++]; } else//是空格,只挪动快指针 { j++; } } s.
  • 参考leetcode15题: 其中参数 int** returnColumnSizes 表示返回数组中每一行的列数: 分配: *returnColumnSizes = (int*)malloc(numsSize * numsSize *sizeof(int)); 使用: (*returnColumnSizes)[*returnSize] ...
  • C语言双重指针

    千次阅读 2018-10-21 23:09:31
    void change(int *p) //函数参数为整形指针,p = v,即 p和v都指向变量num { *p = 2; //修改*p的值也修改了num的值 printf(&quot;p = %d\n&quot;,*p); } int main() { int num = 1; //声明...
  • C语言二重指针与二维数组

    千次阅读 2019-07-23 21:51:28
    因为二维数组是数组的数组,又因为啊a[0]、a[1]、a[2]为三个数组的首地址(等同于&a[0][0]、&a[1][0]、&a[2][0]),所以当我们用二重指针创建数组的时候,实际上是创建了一个指针数组。 #include #include ...
  • https://blog.csdn.net/gl486546/article/details/53375999
  • 主要介绍了深入学习C语言中的函数指针和左右法则,左右法则是一种常用的C指针声明,需要的朋友可以参考下
  • C语言双重指针初始化

    2017-05-25 12:00:00
    /* 双重指针初始化 */ #include <stdio.h> #include <stdlib.h> #include <malloc.h> int main() { int m = 5;/*5行*/ int n = 6;/*6列*/ /* ...
  • C语言 字符指针

    千次阅读 2019-07-10 19:40:09
    字符串常量占据的存储单元数也因此比引号内的字符数大 1。 字符指针 char *p; p = "now is the time"; 将一个指向该字符数组的指针赋值给 p。(C语言没有提供将整个字符串作为一个整体进行...
  • C语言更多查看 C语言使用注意事项(一) ...二级指针又叫双指针C语言中不存在引用,所以当你试图改变一个指针的值的时候必须使用二级指针。C++中可以使用引用类型来实现。 下面讲解C中的二级指针的使用方...
  • C语言双向链表讲解

    千次阅读 2020-04-14 11:53:37
    链表添加了一个指针域,通过两个指针域,分别指向结点的前结点和后结点。这样的话,可以通过链表的任何结点,访问到它的前结点和后结点。 在双向链表中,结点除含有数据域外,还有两个链域,一个存储直接...
  • C语言-使用指针拼接两个字符串数组

    千次阅读 2020-01-24 05:38:18
    C语言—使用指针完成两个字符串的拼接 指针相关知识 在说明拼接问题之前先说明一些和指针的相关问题 字符串数组对应的地址就是字符串数组中第一个元素对应的地址 字符串数组最后一个元素之后肯定是0 拼接的思路 在...
  • C语言二重指针与malloc

    2015-06-19 11:32:00
    假设有一个二重指针: char **p; 同时有一个指针数组 char *name[4]; 如何引用p呢? 首先我们有程序代码如下 #include <stdio.h> int main() { char *s = "I love you"; char *s1 = "you love ...
  • 文章转自:无际单片机大家好,我是无际。今天给大家来讲解一下指针。我会由浅到深,最后结合实际应用讲解,让大家学会指针的同时,知道大佬们都用指针来干嘛!长文预警!全文大约5200多字,学指针看...
  • C语言指针详解,单指针,双重指针(char *和char **)

    千次阅读 多人点赞 2018-12-07 14:18:04
    最近在学习的过程中碰到了char **,突然发现关与一指针的概念很模糊,所以温习了一下 char * 和char ** 之间的联系 char *定义的式一个字符型指针 char ** 定义的是一个双重指针 让我困惑的也就是双重指针 ...
  • 还无法理解双指针,来看看这个动画演示
  • C语言文件的定义,如何对文件进行操作,文件指针,如何定义指向文件的指针,通过文件指针对文件进行操作,文件应用举例,二进制文件相关操作,文件定位
  • C语言指针与二维数组

    千次阅读 2019-09-04 21:26:17
    [ ]的优先级高于*,( )是必须要加的,如果赤裸裸地写作int *p[4],那么应该理解为int *(p[4]),p 就成了一个指针数组,而不是二维数组指针,这在《C语言指针数组》中已经讲到。 对指针进行加法(减法)运算时,它...
  • 函数指针 10.1.1 函数类型 通过什么来区分两个不同的函数? 一个函数在编译时被分配一个入口地址,这个地址就称为函数的指针,函数名代表函数的入口地址。 函数三要素: 名称、参数、返回值。C语言中的函数有自己...
  • c语言指针排序算法 C语言中的指针算法 (Pointer Arithmetic in C) If you want to have complete knowledge of pointers, pointer arithmetic is very important to understand. In this topic we will study how ...
  • C语言指针详解(经典,非常详细)

    万次阅读 多人点赞 2019-06-01 17:26:12
    要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样,...
  • C语言-指针操作

    万次阅读 多人点赞 2016-11-30 23:29:16
    0.引入 在C语言中,
  • [C语言] 指针处理字符串

    千次阅读 2019-08-14 17:39:10
    C语言中,字符串(string,简称串)是一种特殊的char型一维数组。可以把字符串中的字符作为数组中的元素访问,或利用char型指针对其访问。 字符串和字符指针 首先是字符串常量的存储,字符串常量是用一对引号括...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 54,933
精华内容 21,973
关键字:

c语言双指针

c语言 订阅