服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 关于c语言指针的两处小tip分享

关于c语言指针的两处小tip分享

2020-11-29 13:59C语言教程网 C/C++

本篇文章是对c语言中指针的两处小tip进行了详细的分析介绍,需要的朋友参考下

1:常量指针与指针常量

常量指针与指针常量名字很接近,但是两者区别很大。
常量指针是指指向常量的指针,例如:char const *st[4]="str";或者使用下面的方法,效果是一样的:const char *st[4]="str"; 它声明了一个指针变量,这个指针指向了一个常量字符串,但是由于指向的内存空间是常量,因此该地址的内容是不能修改的,例如:*st="no"; //这是不行的,因为内存空间的内容不能修改st="ok"; //这是可以的,虽然指向的内存内容不能修改,但是指针的指向是可以修改的。
指针常量是指一个指向固定内存单元的指针,其内容可以修改,但是不能改变指向的位置,例如:char *const st[4]="str";*st="ok"; //这是可以的,因为指向位置的内容可以修改。st="no"; //这样行不通,因为指针是不能改变指向位置,即如果初始化为地址0X8000,那么它只能指向这个位置,不能改变,但是0X8000的内容是可以改变的。

char *s = "abcde";
s[0] = '1';//此句在运行时出错

如下是可以的:

char s[] = "abcde";
s[0] = '1';

  
因为:

字符串常量是不能改的,编译后是放到只读内存(静态存储区)中的;

char[]和char*在很多地方可以通用,但是有个微妙的关系,那就是头指针相同;

因为“通过指针修改字符串常量的行为”是未定义的,上次就有个人问"为什么上述代码在TC下不报错而在VC6.0下报错"。不过,现在大多实现把常量字符串的存储空间设置为read-only,所以运行时报错;

char *s = "abcde";相当于const char *s = "abcde";

-------------------------------------------
按照楼上各位的说法,编译器应该禁止这么声明:
char *s = "abcde";
而强制我们如下声明:
const char *s = "abcde";
为什么编译器没有这么做呢?
--------------------------------------------
没错,的确因该像楼主说的那样,编译器应该禁止这种行为,进而帮助程序员写出正确的程序。
但是,这是一个特殊情况,是一个特例!
为什么这么说呢?因为char *s = "abcde";这种模式已经被很多人所使用(也包括楼主),它被使用的如此广泛以至于标准给它一些宽容:允许这样的代码通过编译。

-------------------------------------------- 《effective c++》91页注释1:
在C++ standard中,"Hello"的型别是const char[];这个型别几乎总是被视为const char*。因此我们预期,以一个字符串子面常量(string literal,例如"hello")作为一个char*变量的初值,会违反常量性。但是此种行为在C语言中实在太过频繁,所以C++ standard对于这样的初始化动作特别给与豁免。尽管如此,你还是应该避免这么做,因为那毕竟不被大家认同。

延伸 · 阅读

精彩推荐
  • C/C++c/c++内存分配大小实例讲解

    c/c++内存分配大小实例讲解

    在本篇文章里小编给大家整理了一篇关于c/c++内存分配大小实例讲解内容,有需要的朋友们可以跟着学习参考下。...

    jihite5172022-02-22
  • C/C++C语言main函数的三种形式实例详解

    C语言main函数的三种形式实例详解

    这篇文章主要介绍了 C语言main函数的三种形式实例详解的相关资料,需要的朋友可以参考下...

    ieearth6912021-05-16
  • C/C++深入C++拷贝构造函数的总结详解

    深入C++拷贝构造函数的总结详解

    本篇文章是对C++中拷贝构造函数进行了总结与介绍。需要的朋友参考下...

    C++教程网5182020-11-30
  • C/C++OpenCV实现拼接图像的简单方法

    OpenCV实现拼接图像的简单方法

    这篇文章主要为大家详细介绍了OpenCV实现拼接图像的简单方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    iteye_183805102021-07-29
  • C/C++C语言实现双人五子棋游戏

    C语言实现双人五子棋游戏

    这篇文章主要为大家详细介绍了C语言实现双人五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    两片空白7312021-11-12
  • C/C++关于C语言中E-R图的详解

    关于C语言中E-R图的详解

    今天小编就为大家分享一篇关于关于C语言中E-R图的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看...

    Struggler095962021-07-12
  • C/C++使用C++制作简单的web服务器(续)

    使用C++制作简单的web服务器(续)

    本文承接上文《使用C++制作简单的web服务器》,把web服务器做的功能稍微强大些,主要增加的功能是从文件中读取网页并返回给客户端,而不是把网页代码...

    C++教程网5492021-02-22
  • C/C++c/c++实现获取域名的IP地址

    c/c++实现获取域名的IP地址

    本文给大家汇总介绍了使用c/c++实现获取域名的IP地址的几种方法以及这些方法的核心函数gethostbyname的详细用法,非常的实用,有需要的小伙伴可以参考下...

    C++教程网10262021-03-16