首页 > 解决方案 > 更改函数内指针的值

问题描述

我想将指针的值更改为指向函数内部的不同地址。
我知道我需要一个指向指针的指针来执行此操作,但我犯了一个拼写错误并使用char *而不是,char **我得到了下面的结果。

在函数中传递指针的地址,指针变成指向指针地址的指针。 因此,如果我取消引用指针,我将能够更改它指向的值,在这种情况下是 (value of) pointer 。 我知道我无法访问指向的数据(我需要一个论据)。ptr1funcp
*pptr1
ptr1char ** p

但是,如果我唯一的意图是更改ptr1指向的地址,那在 C 中可以接受吗?

#include <stdio.h>

char array1[10] = {'1','2','3','4','5','6','7',};
char array2[10] = {'A','B','C','D','E','F','G',};

void func(char * p)
{
    printf("func is called\n");
    *p = array2;
}

int main(void)
{
    char * ptr1 = NULL;
    ptr1 = array1;

    printf("ptr1 = %s\n", ptr1);
    func(&ptr1);
    printf("ptr1 = %s\n", ptr1);
    return 0;
}

这是我得到的结果。

ptr1 = 1234567
func is called
ptr1 = ABCDEFG

标签: cfunctionpointers

解决方案


您的代码是错误的,并且您(不)幸运地使用错误的代码获得了所需的输出。

该函数func仅根据传递的指针修改一个字节,因为指针是char*.

看来您正在使用 little-endian 环境,并且第一个元素的地址array1array2除了最低字节之外碰巧相同,因此ptr1修改后的值恰好通过仅修改一个字节来正确。

尝试更换

char array1[10] = {'1','2','3','4','5','6','7',};
char array2[10] = {'A','B','C','D','E','F','G',};

char array1[256] = {'1','2','3','4','5','6','7',};
char array2[256] = {'A','B','C','D','E','F','G',};

(改变数组元素的数量)你可能会得到另一个结果。如果您未能获得其他结果,请尝试其他尺寸。


推荐阅读