在C语言中将函数指针作为只读传递

6
正如标题所说,我能传递一个指针给函数,以便只复制指针的内容吗? 我必须确保函数不修改这些内容。非常感谢。

8年过去了,我意识到这个问题是多么愚蠢和毫无意义。指针是数据的引用,所以唯一的方法就是复制数据,没有像只读内存权限这样的东西(除非是保存可执行文件本身的部分)。 - John White
4个回答

7
是的,
void function(int* const ptr){
    int i;
    //  ptr = &i  wrong expression, will generate error ptr is constant;
    i = *ptr;  // will not error as ptr is read only  
    //*ptr=10;  is correct 

}

int main(){ 
    int i=0; 
    int *ptr =&i;
    function(ptr);

}

void function(int* const ptr) 中,ptr是常量,但是它指向的内容不是常量,因此 *ptr=10 是正确的表达式!
void Foo( int       *       ptr,
          int const *       ptrToConst,
          int       * const constPtr,
          int const * const constPtrToConst )
{
    *ptr = 0; // OK: modifies the "pointee" data
    ptr  = 0; // OK: modifies the pointer

    *ptrToConst = 0; // Error! Cannot modify the "pointee" data
    ptrToConst  = 0; // OK: modifies the pointer

    *constPtr = 0; // OK: modifies the "pointee" data
    constPtr  = 0; // Error! Cannot modify the pointer

    *constPtrToConst = 0; // Error! Cannot modify the "pointee" data
    constPtrToConst  = 0; // Error! Cannot modify the pointer
} 

Learn here!


在 void function(const int* ptr) 中,ptr 是常量,但它所指向的内容并不是常量。因此,在 void function(const int* ptr) 中 ptr=10 是一个有效的表达式。但我认为这不正确。在这种情况下,ptr 是只读的,因此您不能对其进行赋值。 - Daniel Scocco

6

你可以使用const

void foo(const char * pc)

这里的pc是指向const char的指针,通过使用pc,你无法编辑其内容。

但这并不保证你无法改变内容,因为你可以创建另一个指向同一内容的指针来修改内容。

所以,如何实现取决于你自己。


3

我必须确保该函数不会编辑内容

除非该函数使用const参数,否则您唯一能做的就是显式传递数据的副本,可以使用memcpy创建。


1
即使您将(const int *ptr)用作参数,您仍然可以更改指向的值(例如在函数内创建第二个指针)。确保不会更改的唯一方法是确实传递该值的副本。对吗? - Daniel Scocco
2
如果它创建一个非const指针并使其指向const指针的内容,则会进入未定义行为领域。也就是说,这是无效的代码。 - cnicutar
我不能使用const,我只想确保函数使用通过指针传递的内容的副本。 memcpy看起来是最好的解决方案,你能给我展示语法吗? - John White
@HaskellElephant,我不明白你的意思。能否详细解释一下?我在你指出的答案中看到了许多例子,但我仍然坚持我的答案:如果函数没有保证 - 在使用“const”正确方式或文档中 - 确定的唯一方法是传递一个副本。 - cnicutar

0
我必须确保该函数不会编辑内容。
什么内容?指针指向的值吗?在这种情况下,您可以像这样声明函数:
void function(const int *ptr);

那么function()不能更改指向ptr的整数。

如果您只想确保未更改ptr本身,请不用担心:它是按值传递的(与C中的所有内容一样),因此即使函数更改其ptr参数,也不会影响传入的指针。


1
即使您声明函数的方式,指针所指向的值仍然可以更改。例如,可以在函数内部创建第二个指针,将其属性设置为ptr的内存地址,然后更改那里的值。 - Daniel Scocco
@DanielS 如果你有一个 void func(const int *ptr) 函数,那么写 *(int *)ptr = 42; 是未定义的行为,所以你是错误的。 - user529758

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接