精华内容
下载资源
问答
  • 一、直接修改 和 间接修改 指针变量 的值、 二、在函数中 间接修改 指针变量 的值、 三、在函数中 间接修改 外部变量 的原理、





    一、直接修改 和 间接修改 指针变量 的值



    直接修改 指针变量 的值 , 就是为其赋值一个地址值 , 使用 & 取地址符 , 将变量地址赋值给指针变量 , 或者使用 malloc 函数分配内存赋值给 指针变量 ;

        // 将变量地址赋值给一级指针
        p = &a;
    

    间接修改 指针变量 的值 , 首先要 将 指针变量 的 地址值 , 赋值给 1 1 1 个 二级指针 变量 , 通过 * 符号 , 间接修改 一级指针变量的值 ;

        // 将一级指针的地址赋值给二级指针
        p2 = &p;
    
        // 间接修改指针的值
        *p2 = 12345678;
    

    直接修改 和 间接修改 指针变量 的值 代码示例 :

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        // 定义普通变量
        int a = 0;
    
        // 声明指针变量 , 并为其设置 NULL 初始值
        // NULL 就是 0
        int *p = NULL;
    
        // 声明二级指针变量 , 并为其设置 NULL 初始值
        int **p2 = NULL;
    
        // 将变量地址赋值给一级指针
        p = &a;
    
        // 打印一级指针地址
        printf("%d\n", p);
    
        // 将一级指针的地址赋值给二级指针
        p2 = &p;
    
        // 间接修改指针的值
        *p2 = 12345678;
    
        // 打印一级指针地址
        printf("%d\n", p);
    
        // 命令行不要退出
        system("pause");
        return 0;
    }
    

    执行结果 :

    在这里插入图片描述





    二、在函数中 间接修改 指针变量 的值



    函数间接修改 指针变量 的值 , 将 指向一级指针二级指针 变量 , 传递到 函数形参 中 , 在 函数中 , 使用 * 符号 , 修改 二级指针 指向的 一级指针 的变量值 ;

    注意 : 如果要 修改 一级指针 的值 , 必须 传入 指向 一级指针二级指针 变量 才可以 , 传入一级指针变量 , 不能修改一级指针变量值 ;

    这是因为 如果传入 一级指针 变量 , 这个传入的 一级指针 变量 , 其 生命周期 到函数结尾就结束了 , 跟函 数外部的 一级指针 变量 没有任何关系 ;

    如果 要修改 函数外部 的变量 , 必须传入 指向该变量的 指针才可以 ;


    代码示例 :

    #include <stdio.h>
    #include <stdlib.h>
    
    /*
     * 函数中简介修改指针值
     */
    void modify_pointer(int **p)
    {
        // 间接修改指针的值
        *p = 456789;
    }
    
    int main()
    {
        // 定义普通变量
        int a = 0;
    
        // 声明指针变量 , 并为其设置 NULL 初始值
        // NULL 就是 0
        int *p = NULL;
    
        // 声明二级指针变量 , 并为其设置 NULL 初始值
        int **p2 = NULL;
    
        // 将变量地址赋值给一级指针
        p = &a;
    
        // 打印一级指针地址
        printf("%d\n", p);
    
        // 将一级指针的地址赋值给二级指针
        p2 = &p;
    
        // 间接修改指针的值
        *p2 = 12345678;
    
        // 打印一级指针地址
        printf("%d\n", p);
    
        // 在函数中 , 简介修改指针的值
        modify_pointer(p2);
    
        // 打印一级指针地址
        printf("%d\n", p);
    
        // 命令行不要退出
        system("pause");
        return 0;
    }
    
    

    执行结果 :

    6422216
    12345678
    456789
    请按任意键继续. . .
    

    在这里插入图片描述





    三、在函数中 间接修改 外部变量 的原理



    如果要 修改 一级指针 的值 , 必须 传入 指向 一级指针二级指针 变量 才可以 , 传入一级指针变量 , 不能修改一级指针变量值 ;

    这是因为 如果传入 一级指针 变量 , 这个传入的 一级指针 变量 , 其 生命周期 到函数结尾就结束了 , 跟函 数外部的 一级指针 变量 没有任何关系 ;

    如果 要修改 函数外部 的变量 , 必须传入 指向该变量的 指针才可以 ;

    展开全文
  • } 解释: Test是声明了一个指针,然后到子函数中用malloc进行内存申请,但是后面打印的时候发现,返回的结果为null。这里又写了Test2,将一个int变量作为形参传入,Test只是将一个指针变量作为形参传入, 这里Test...

    转载自:https://blog.csdn.net/qq_22525091/article/details/80116128

    code

    #include<stdio.h>
    #include<stdlib.h>
    void  GetMemory(char *p, int num)
    {
        p = (char *)malloc(sizeof(char)  * num);
    }
    
    void  Test(void)
    {
        char *str = NULL;
    
        GetMemory(str, 100);    // str 仍然为 NULL 
        printf("address str:%p \n", str);
        // strcpy(str,  "hello");   // 运行错误
    }
    
    void getsum(int sum, int n)
    {
        for (int i = 0; i < n; i++)
        {
            sum += i;
        }
    }
    
    void Test2()
    {
        int sum = 0;
        getsum(sum, 10);
        printf("sum value:%d \n", sum);
    }
    
    int main(int argc, char** argv){
        Test();
        Test2();
        return 0;
    }
    

    解释:

    • Test是声明了一个指针,然后到子函数中用malloc进行内存申请,但是后面打印的时候发现,返回的结果为null。这里又写了Test2,将一个int变量作为形参传入,Test只是将一个指针变量作为形参传入,
    • 这里TestTest2差不多的。传入的变量在子函数都会新建一个副本,副本改变了,原来的不会改变。如果要改变原来的值,需要使用指针。
    展开全文
  • 函数形参 的 值 , 不要轻易进行改变 , 因此一般函数的形参 , 都定义为 const char * 指针常量 类型 ; 引入 辅助 局部变量 , 接收 函数 形参变量 ;...凡是涉及 修改指针指向 的操作一律创建新的 指针变量 执行 ;





    一、函数形参使用推荐方法



    在函数中 , 形参 中的 指针变量 , 不建议直接使用 ;

    推荐 在 函数中 , 定义 局部 指针变量 , 接收 形参中的 指针变量 , 具体操作的是 函数中 定义的 局部指针变量 ;


    直接使用 *to_tmp++ 样式的代码 , 会改变指针指向 , 有可能会导致错误 , 一旦出错 , 根本无法排查 ;

    如果 将 数组首地址常量指针指针指向 进行修改 , 直接就报错了 ;


    函数形参 的 值 , 不要轻易进行改变 , 因此一般函数的形参 , 都定义为 const char * 指针常量 类型 ;


    引入 辅助 局部变量 , 接收 函数 形参变量 ;


    凡是涉及 修改指针指向 的操作一律创建新的 指针变量 执行 ;


    代码示例 :

    /*
     * 实现字符串拷贝 ( 实现了模块化 )
     *      将 from 指针指向的字符串 拷贝到 to 指针指向的字符串换
     */
    void str_copy(char *from, char *to)
    {
        // 使用局部变量 接收 形参
        char *from_tmp = from;
        char *to_tmp = to;
    
        // 判断 参数中的 指针变量 不为空
        if(from_tmp == NULL || to_tmp == NULL)
        {
            // 这两个指针有任何一个为空 , 都直接退出
            return;
        }
    
        // 从 from 指针指向的字符 拷贝到
        //  to 指针指向的字符
        //  如果拷贝的值不是 \0 , 则指针累加
        //  如果拷贝的值是 \0
        // 这样就不需要额外拷贝 \0 字符了
        while((*to_tmp++ = *from_tmp++));
    }
    




    二、完整代码示例



    代码示例 :

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    /*
     * 实现字符串拷贝 ( 实现了模块化 )
     *      将 from 指针指向的字符串 拷贝到 to 指针指向的字符串换
     */
    void str_copy(char *from, char *to)
    {
        // 使用局部变量 接收 形参
        char *from_tmp = from;
        char *to_tmp = to;
    
        // 判断 参数中的 指针变量 不为空
        if(from_tmp == NULL || to_tmp == NULL)
        {
            // 这两个指针有任何一个为空 , 都直接退出
            return;
        }
    
        // 从 from 指针指向的字符 拷贝到
        //  to 指针指向的字符
        //  如果拷贝的值不是 \0 , 则指针累加
        //  如果拷贝的值是 \0
        // 这样就不需要额外拷贝 \0 字符了
        while((*to_tmp++ = *from_tmp++));
    }
    
    int main()
    {
        // 定义一个字符串数组
        // "Hello World!" 常量在 全局区 的常量区
        // 然后 拷贝到了 栈内存中的 array 数组中
        char array[] = "Hello World!";
    
        // 在栈内存中定义 char *指针
        // 在堆内存分配 20 字节内存 , 用于存放字符串
        char *buffer = malloc(20);
    
        // 调用字符串拷贝函数
        str_copy(array, buffer);
    
        // 打印拷贝结果
        printf("buffer = %s\n", buffer);
    
        // 命令行不要退出
        system("pause");
        return 0;
    }
    
    

    执行结果 :

    在这里插入图片描述

    展开全文
  • C语言标准规定数组的值可以改变,而修改字符串字面量的值的结果是未定义的(详见分割线后,感谢 @Sunchy321 指正)。char s[LEN]和char *s这两个s不是一种东西。这个问题编译器的具体实现一般是这样的: char s[10] ...

    作者:知乎用户
    链接:https://www.zhihu.com/question/28191923/answer/40028231
    来源:知乎

    C语言标准规定数组的值可以改变,而修改字符串字面量的值的结果是未定义的(详见分割线后,感谢 @Sunchy321 指正)。char s[LEN]和char *s这两个s不是一种东西。这个问题编译器的具体实现一般是这样的:

    char s[10] = "whatever";
    

    也相当于

    char s[10] = {'w','h','a','t','e','v','e','r','\0'};
    

    会在stack分配10个字节给数组s,然后把"whatever"拷贝进去。stack是可读写的,所以你可以修改字符数组的值。

    char *s = "whatever";
    

    会在stack分配sizeof(char *)字节的空间给指针s,然后将s的值修改为"whatever"的地址,而这段地址一般位于只读数据段中。在现代操作系统中,可以将一段内存空间设置为“读写数据”、“只读数据”等等多种属性,一般编译器会将"whatever"字面量放到像".rodata"这样的只读数据段中,修改只读段会触发 CPU 的保护机制(#GP)从而导致操作系统将程序干掉。
    我是分割线
    ISO/IEC 9899:1999 (E) , §6.4.5 String literals (P63L5):If the program attempts to modify such an array, the behavior is undefined.修改字符串字面量的行为是Undefined Behavior,也就是说具体实现是依赖编译器的,上文所举的例子只是x86下常见的情况,但并不是C语言标准所规定的。比如,

    char *a = "WhatEver";
    char *b = "WhatEver";
    

    编译器完全可以为节约空间只存储一个"WhatEver",也就是实际上a = b,这种情况下,在没有段保护机制的系统中如果你a[4] = “O”;很可能会导致 a 变为 “WhatOver” 的同时 b 也变为 “WhatOver”。


    
    #include <stdio.h>
    char* strcpy(char *strDest, const char* strSrc)
    {
        char *p=NULL;
        if(strDest == NULL || strSrc == NULL)
        {
            return NULL;
        }
        p = strDest;
        while((*strDest++ = *strSrc ++) != '\0');
        return p;
    
    }
    
    int main()
    {
    	//char* str1="HI!!!";
    	//char* str2="Hell0";
    	char str1[6]="hello";
    	char str2[6]="hi!!!";
    	
    	//mystrcpy(str1,str2);
    	strcpy(str1,str2);
    	printf("%s",str1);
    	
    	return 0;
    }
    

    zhihu

    展开全文
  • 一、判定指针合法性、 二、数组越界、 三、不断修改指针变量值、 四、函数中将栈内存数组返回、 五、函数间接赋值形参操作、 六、指针取值与自增操作、
  • 如果要这样做,则需要传入指向指针指针。voidbarPush(BarList**list,Bar*bar){if(list==NULL)return;//needtopassinthepointertoyourpointertoyourlist.//ifthereisnomovetoadd,thenwearedoneif(bar...
  • ·指针指针指针就是地址指针变量:存放变量地址的变量使用指针的目的:要通过指针能够找到被指的变量,或者说要通过指针间接访问被指的变量取变量;栈区int *p 指向int类型的指针%p 输出指针&取址符初始化int ...
  • 那么现在有个问题,通过传递一个指针,可以改变该指针所指向地址的内容,那么如何改变指针本身呢?即如何改变指针的指向? 先看一个错误的例子 void change_ptr(void *ptr, void *dest) { ptr = dest; } 如果是这样...
  • “工具”->“选项”->“文本编辑器”->“C/C++”->“代码样式”->“格式设置”->“间距”->“指针/引用对齐方式”->“右对齐”
  • 导入指针的手骨图片,并拉到中间点击位置 在项目设置里,用户界面,软件光标 添加设置默认的UI 鼠标控件 点击变化暂时没做,点击变化的判定要求比较高,需要各种界面都进行调试,暂时搁置 ...
  • #include <iostream> using namespace std; int main() { cout<<"开始运行了"<<endl; int a = 2, b = 3, c = 4; int *p = &... //改变*p指针所指对象的值 //下面这一句,把a的值
  • 首先需要明确的是当我们将指针作为函数的形参如fun1()函数所示: #include<stdio.h> #include <stdlib.h> typedef struct Lstruct { int data; }LS; void fun1(LS *p1, LS *p2){ p1 = p2; } int ...
  • 知道了问题,修改就很容易了,下面的写法才是指针型变量最常用的代码片段: 如果我想修改str,比如某个函数负责申请一块内存返回,这时候我们修改的是指针地址(&p)的值,那么就要传入需要指针指针。 void ...
  • Golang的指针变量

    2021-08-21 22:48:35
    golang中的指针变量 与c++相似,golang使用“*变量类型”来...因此golang中可以将参数设置为指针形式来实现在函数中修改实参的值。 var a int = 10 var ptr *int = &a //ptr为指针变量,&为取地址符 fmt.
  • const关键字修饰指针

    2021-12-07 16:26:45
    错误:因为被const修饰的变量是常变量,即a为不可修改的左值。 2,const修饰指针————常量指针指针常量 int a=10; int b=20; const int* p=&a; 常量指针 *p=20;错误:因为const修饰*p,表示指针指向...
  • C/C++指针踩坑历险记-常量指针-const ptr *,指针常量ptr * const,引用,指针传参,指针修改指针指向的值修改等问题 好久没写C语言了,不过一直用C++在刷题,遇到指针总有些发憷?初学指针的时候觉得指针好难,...
  • C语言复习之改变变量的指针地址

    千次阅读 2021-05-02 10:26:59
    将一个变量传递到函数中修改指针的地址 修改NULL值的指针指向 基本理念 传递一个比原来指针更高一级的指针即可,然后在函数中使用*原来指针变量=地址值即可 2.一个基本的字符指针修改demo #include <...
  • C语言学习笔记之通过指针修改变量的值时隔多年,重拾C语音,忽然有种重返大学校园的感觉。青春,朝气,活力,一下子扑面而来,所以就先写个“Hello,world ”压压惊吧! #include #include #include #include int ...
  • 链表中插入结点时指针变化的顺序问题 错误操作示范:从左向右 正确操作示范:从右向左 p->next=s; s->next=p->next; //此时的p->next已经指向了结点s,所以不能将其再次赋给s->next s->next=p-...
  • 使用二级指针修改带const的只读常量 修饰词带const的常量一般是作为可读常量,不容易被改变其赋值,但是使用二级指针可以改修初始值 虽然编译有报警提示,但是还是可以编译通过的。 #include <stdio.h> int ...
  • 一、变量修改、 1、直接修改变量、 2、通过内存地址间接修改变量、 3、通过指针间接修改变量、
  • C语言函数调用指针并进行修改,但是主函数的指针地址未更改(strchr函数)char * my_strchr(char const * str,int ch){char *标志= NULL;for(;(str=strchr(str,ch))!=NULL;str++)flag=str;return flag;}int main(){...
  • 用cout获取const型变量的地址后,再用cin语句手动把地址赋给指针,并对指针赋值。代码如下: #include<iostream> using namespace std; int main() { int a; const int c=800; cout<< (int)&c; ...
  • 使用指针修改和取消引用指针有两个与指针关联的值。第一个是存储在指针本身中的存储地址,第二个是存储在该存储地址中的数据。要修改存储在指针变量中的地址,只需使用等号:RxByte_ptr = 0x40;复制代码要访问存储...
  • #include<stdio.h> int source =1; int* cope_adress(int *a) { a=&source; } int main() { int b=2; int *purposes; printf("source address is %p\n",&source);... printf.
  • 电脑现已成为我们工作、生活和娱乐必不可少的工具了,在使用电脑的过程中,可能会遇到电脑如何更改鼠标的指针样式?的问题,如果我们遇到了电脑如何更改鼠标的指针样式?的情况,该怎么处理怎么才能解决电脑如何更改...
  • 来看看修改指针颜色的方法吧。 1. 点击菜单栏左上角的苹果菜单,选择”系统偏好设置“,在弹出的设置窗口点击”辅助功能“。 2. 点击左侧窗格中的”显示“,然后在右侧切换到”指针“选项卡。 在窗口下方,...
  • 控制文件指针的移动 1、指针 指针移动的单位都是以bytes/字节为单位 只有一种情况特殊: t模式下的read(n),n代表的是字符个数 with open('aaa.txt',mode='rt',encoding='utf-8') as f: res=f.read(4) print(res) 2、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 771,701
精华内容 308,680
关键字:

修改指针