GVKun编程网logo

C语言const int *a和int*const a 的区别详解(const int a 和 int const a)

14

在本文中,我们将详细介绍C语言constint*a和int*consta的区别详解的各个方面,并为您提供关于constinta和intconsta的相关解答,同时,我们也将为您带来关于#define和

在本文中,我们将详细介绍C语言const int *a和int*const a 的区别详解的各个方面,并为您提供关于const int a 和 int const a的相关解答,同时,我们也将为您带来关于#define和const在C语言中的区别是什么?、ASP.NET中readonly与const的区别详解、c – const char *,char const *,const char const *&string存储之间的区别、c – const TypedeffedIntPointer不等于const int *的有用知识。

本文目录一览:

C语言const int *a和int*const a 的区别详解(const int a 和 int const a)

C语言const int *a和int*const a 的区别详解(const int a 和 int const a)

对于“const int*p”与“int*const p”这两种声明方式,相信很多程序员都会头痛。它们两者之间究竟有什么不同之处呢?为了加深大家对这两种声明方式的理解,下面就先从“const int i”与“int const i”之间的区别谈起。

对于 const 关键字,相信大家并不陌生,前面的章节也做了相关的说明。对变量来说,const 关键字可以限定一个变量的值不允许改变,从而保护被修饰的东西,防止意外修改,在一定程度上可以提高程序的安全性和可靠性。如下面的示例代码所示:
const int i=10;
i++;
很显然,上面的语句“i++”是错误的,无法通过编译,因为 const 修饰的变量 i 是不可以被修改的。然而对于下面的语句:
int const i=10;
i++;
对于语句“i++”,编译器会报同样的错误提示。由此可见,“const int i”与“int const i”是完全相同的概念,const 与 int 哪个写在前面都不影响语义,理解这一点很重要。

理解“const int i”与“int const i”之后,继续来看“const int*p”与“int*const p”这两种声明方式,看下面的例子:
int i1 = 10;
int i2 = 20;
const int *p = &i1;
/* 输出结果是10 */
printf("%d\n",*p);
p = &i2;
/* 输出结果是20 */
printf("%d\n",*p);
i2 = 30;
/* 输出结果是30 */
printf("%d\n",*p);
或许这个时候看了上面的示例代码,你会有这样一个疑问:为什么 p 的值是可以被修改的,它可以重新指向另一个地址呢?

其实回答上面的问题并不难,只要注意如下两点:

首先,这里的 const 关键字修饰的是整个“*p”,而不是 p。所以这里的“*p”是不能被赋值的,也就是说我们不能通过“*p”来修改 i2 的值。

其次,p 前并没有用 const 关键字进行修饰,所以 p 是指针变量,能被赋值重新指向另一内存地址。也就是说下面的代码是合法的:
p = &i2;
i2 = 30;
看到这里,你也许会更加疑惑:那又该如何使用 const 来修饰 p 呢?

这个时候,我们就要使用“int*const p”这种声明形式了。很显然,这里的 const 是写在 p 前和 * 号后的,而不是写在“*p”前的,所以它是用来修饰限定 p 的。如下面的示例代码所示:
int i1 = 10;
int i2 = 20;
int *const p = &i1;
/* 输出结果是10 */
printf("%d\n",*p);
/* p=&i2; p不能再这样重新赋值了,即不能再指向另一个新地址*/
/* 可以通过*p修改i1的值*/
i1 = 30;
/* 输出结果是30 */
printf("%d\n",*p);
从上面的示例代码可以看出,通过“int*const p”声明之后,p 因为有了 const 的修饰,所以只是一个指针常量。因此,这里的 p 值是不能重新赋值修改的,它只能永远指向初始化时的内存地址。即下面的代码是不合法的:
p = &i2; /*p不能再这样重新赋值了,即不能再指向另一个新地址*/
但是,也正因为这里的整个“*p”的前面没有 const 修饰。也就是说,“*p”是变量而不是常量,所以我们可以通过“*p”来修改它所指内存 i1 的值。因此,下面的语句是合法的:
i1 = 30;
由此可见,如果关键字 const 直接写在“*p”前,则程序不能修改“*p”,但可以修改 p;如果关键字 const 直接写在 p 前,则程序不能修改的是 p,但可以通过“*p”来修改它所指内存的值。理解这两点很重要,否则很难掌握“const int*p”与“int*const p”两者之间的根本区别。

在了解“const int*p”与“int*const p”两者之间的区别之后,为了巩固大家的理解,继续看下面的示例:
const int i=10;
int *p;
/* 强制类型转换*/
p= (int *) &i;
printf("*p=%d\n",*p)
/*这种赋值是合法的*/
*p=20;
printf("i=%d\n",i);
printf("*P=%d\n",*p);
在上面的代码中,因为 const int 类型的 i 的地址是不能赋值给指向 int 类型地址的指针 p 的(否则 p 岂不是能修改i的值)。因此下面的语句是不合法的:
p = &i;
但是,可以通过强制类型转换进行赋值,因此下面的这种赋值方法是合法的:
p= (int *) &i;
*p=20;
但值得注意的是,尽管可以通过强制类型转换进行赋值,也不能通过“*p=20”来修改 i 的值。因此,“printf("i=%d\n”,i)”输出的结果是 10,并不是 20。

示例运行结果为:
*p=10
i=10
*p=20

#define和const在C语言中的区别是什么?

#define和const在C语言中的区别是什么?

#define和const在c语言中的区别是什么?

#define 是预处理器指令。因此,当我们使用#define定义一些宏时,它会在编译前用它的值替换到代码中。因此,当编译器对代码一无所知时,宏值也会被替换。

常量实际上是一个变量。通过声明这个变量,它就占用了内存单元。但我们不能直接更新常量类型变量的值。我们可以使用一些指针值来改变它。

有时程序员可能会认为使用宏比 const 更好,因为这不会占用任何额外的内存空间,但对于一些好的编译器来说,优化后的代码会不影响。它们非常相似。

以上就是#define和const在C语言中的区别是什么?的详细内容,更多请关注php中文网其它相关文章!

ASP.NET中readonly与const的区别详解

ASP.NET中readonly与const的区别详解

const是一个修饰常量的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性,它在程序设计中有着非常重要的作用,给开发人员带来非常方便的应用。
下面我们来建一个控制台应用程序作测试

public class Test
{
  public readonly string name = "George";
  public const string coname = "ABC Company LLC";
  public Test(string name)
  {
    // readonly 修饰的变量能且只能在 Constructor(构造函数)中被改变  
    this.name = name;
  }
  public string _name
  {
    get
    {
      return name;
    }
    //不可以对readonly修饰的变量进行Set操作  
    //set    
    //{    
    //  name = value; 
    //}   
  }
}
  
class Program
{
  static void Main(string[] args)
  {
    Test obj = new Test("Test");
    //readonly的变量不可以修改值,只能在 Constructor(构造函数)中被改变    
    //obj.name = "New Value";     
    Console.WriteLine(obj.name);   
    //const 的变量直接通过对象访问,不需要实例化 
    Console.WriteLine(Test.coname);
    Console.Read();
  }
}

以前一直以为 readonly 与 const 的作用是一样的,现在明白它们之间的区别了,不知道您是否也明白了呢?希望大家有所收获吧!

您可能感兴趣的文章:
  • 深入探讨C#中的const、readonly关键字
  • C#基础知识系列八const和readonly关键字详细介绍
  • c#.net中const和readonly的区别
  • C#中 const 和 readonly 的不同
  • C#中const 和 readonly 修饰符的用法详解

c – const char *,char const *,const char const *&string存储之间的区别

c – const char *,char const *,const char const *&string存储之间的区别

首先,有什么区别:
(1) const char*(2) char const*(3) const char const*

我相当肯定我完全理解了这一点,但是我想让某人给我一个句子,具体来说就是粘在我的脑海里.这是其中一件事,我很好,直到有人把我当场,然后它变得模糊!

另外,编译器如何存储string-literall?这不是家庭作业,我只是在C上刷新面试,以防任何人关心.

解决方法

1和2是等价的,并指定一个指向const char的指针的类型.指针本身不是const. 3是无效的,因为它重复“const”.就像说const const int一样.这个顺序是不相关的,所以也是说int const int.

在C99中,这样重复const就是有效的.但在C中,你不能重复.

Also,how are string-literalls stored by the compiler?

它们以未指定的方式存储.但编译器可以将它们存储在程序的只读部分.所以你不能写字符串文字.您保证在整个程序生命周期内保持分配(换句话说,它们具有静态存储持续时间).

This isn’t homework,I’m just brushing up on C for interviews in case anyone cares.

你应该意识到C和C之间的细微差别.在C99中,如上所述,const const int是允许的.在C89和C中是禁止的.在C中,您可以引入一个冗余的const,如果应用于本身是const的typedef:

typedef int const cint;cint const a = 0; // this const is redundant!

模板参数也是如此.

c – const TypedeffedIntPointer不等于const int *

c – const TypedeffedIntPointer不等于const int *

我有以下C代码:

typedef int* IntPtr;
const int* cip = new int;
const IntPtr ctip4 = cip;

我用Visual Studio 2008编译它并得到以下错误:

error C2440: ‘initializing’ : cannot convert from ‘const int *’ to ‘const IntPtr’

显然,我对typedef的理解不是应该的.

我问的原因是,我将指针类型存储在STL映射中.我有一个函数返回一个const指针,我想用它在地图中搜索(使用map :: find(const key_type&)).

const MyType*

const map<MyType*,somedata>::key_type

是不相容的,我有问题.

问候
短剑

解决方法

当你编写const IntPtr ctip4时,你声明一个const-pointer-to-int,而const int * cip声明一个指向const-int的指针.这些不一样,因此转换是不可能的.

您需要将cip的声明/初始化更改为

int * const cip = new int;

要在您的示例中解决此问题,您需要将映射的键类型更改为const MyType *(是否有意义取决于您的应用程序,但我认为通过用作键的指针更改MyType对象地图不太可能),或者回到const_casting参数来查找:

#include <map>

int main()
{
    const int * cpi = some_func();

    std::map<const int *,int> const_int_ptr_map;
    const_int_ptr_map.find(cpi); //ok

    std::map<int *,int> int_ptr_map;
    int_ptr_map.find(const_cast<int *>(cpi)); //ok
}

今天关于C语言const int *a和int*const a 的区别详解const int a 和 int const a的分享就到这里,希望大家有所收获,若想了解更多关于#define和const在C语言中的区别是什么?、ASP.NET中readonly与const的区别详解、c – const char *,char const *,const char const *&string存储之间的区别、c – const TypedeffedIntPointer不等于const int *等相关知识,可以在本站进行查询。

本文标签: