C 中指针的常量用法

问题描述 投票:0回答:6

我正在复习 C,并且有一个关于

const
指针用法的问题。 我理解以下代码:

const char *someArray

这是定义一个指向 char 类型的指针,而

const
修饰符意味着
someArray
中存储的值无法更改。 然而,下面这句话是什么意思呢?

char * const array

这是指定参数的另一种方法,该参数是指向名为“array”的数组的 char 指针,该数组是

const
并且无法修改?

最后,这个组合意味着什么:

const char * const s2

作为参考,这些内容取自 Deitel C 编程书籍第 7 章,所有这些都用作传递给函数的参数。

c pointers constants
6个回答
81
投票
正如您所说,

const char*
是一个指向字符的指针,您无法更改字符的值(至少不能通过指针(不放弃常量))。

char* const
是一个指向字符的指针,可以在其中更改字符,但不能使指针指向不同的字符。

const char* const
是指向常量 char 的常量指针,即您既不能更改指针指向的位置,也不能更改被指向者的值。


33
投票

来自 const int*、const int * const、int const *有什么区别:

倒着读...

int* - pointer to int
int const * - pointer to const int
int * const - const pointer to int
int const * const - const pointer to const int

14
投票

简而言之,区别在于:

  • 指向常量的指针。
  • 本身
  • 常量的指针。
  • 一个指针,
  • 常量,指向一个常量。
这里有一些代码来演示。

// pointer to a const void f1() { int i = 100; const int* pi = &i; // *pi = 200; <- won't compile pi++; } // const pointer void f2() { int i = 100; int* const pi = &i; *pi = 200; // pi++; <- won't compile } // const pointer to a const void f3() { int i = 100; const int* const pi = &i; // *pi = 200; <- won't compile // pi++; <- won't compile }
    

11
投票
你应该尝试一下

cdecl

~ $ cdecl 输入“帮助”或“?”寻求帮助 cdecl> 解释
const char *someArray
将 someArray 声明为指向 const char 的指针
cdecl> 解释 char * const someArray
将 someArray 声明为指向 char 的 const 指针
cdecl> 解释 const char * const s2
将 s2 声明为指向 const char 的 const 指针
cdecl>

    

3
投票
char * const array;

这意味着指针是恒定的。另外,

const * const char array;

表示指向常量内存的常量指针。


0
投票
重复其他用户写的内容,但我想提供上下文。

采用这两个定义:

void f1(char *ptr) { /* f1 can change the contents of the array named ptr; * and it can change what ptr points to */ } void f2(char * const ptr) { /* f2 can change the contents of the array named ptr; * but it cannot change what ptr points to */ }

使指针本身

const

,就像在 f2 示例中一样,
绝对几乎毫无意义。传递给函数的每个参数都是按值传递的。如果函数更改该值,它只会更改其本地副本,对调用代码没有影响。

/* ... calling code ... */ f1(buf); f2(buf);

无论哪种情况,

buf

在函数调用后都保持不变。


考虑 strcpy() 函数

char *strcpy(char *dest, const char *src);

一种可能的实现是

char *strcpy(char *dest, const char *src) { char *bk = dest; while (*src != '\0') { *dest++ = *src++; } *dest = *src; return bk; }

此实现仅更改函数内部的

dest

src
。使用任一指针(或两者)
const
 不会为 strcpy() 函数或调用代码带来任何好处。

© www.soinside.com 2019 - 2024. All rights reserved.