ques1: 数组名完全等价于指针常量吗?
int array[10] = { 10,11,12,13,14,15 };
printf("sizeof(array)= %d \n", sizeof(array)); char* const str_2 = "QQQQQQQQQQQQQQ";
printf("sizeof(str_2)= %ld \n", sizeof(str_2));
// 此实验说明虽然数组名的实现 和 指针常量(例如char* const p)很类似, 但在编译器眼里,仍然是有区别的:
// sizeof(数组名)等于数组大小, 而sizeof(指针常量)等于4字节(32位平台)或8字节(64位平台)
// 知道这个区别就行,下次和别人聊天,不要把数组名完全等价为指针常量。
ques2: C语言的指针常量,是真常量吗?
char** pp = (char**)(&str_2);
char data = 'c';
*pp = &data;
printf("str_2 = %c \n", str_2[0]);
//实测,指针str_2的指向可以被修改,所以在C语言中,中文表达的所谓“指针常量”这个称呼并不准确。
//C语言内的常量只有字面常量和枚举值。 ( PS:注意,要区分 枚举值 和 枚举变量(注意,要区分 枚举值 和 枚举类型定义的变量 ) )

指针常量和常量指针,这俩中文表述其实并不严谨。但是也有方法来理解其意思。

所谓指针常量,侧重点是常量,int* const p,p就是这里所谓的常量。

所谓常量指针,侧重点是个指针,const int* p;

很显然,数组名更贴近 int* const p, 绝对不是const int* p,所以更贴近指针常量。

但是需要补充:

1. 在C语言中,中文表达的所谓“指针常量”这个称呼并不准确,指针常量,并不是常量。

C语言内的常量只有字面常量和枚举值(注意,要区分 枚举值 和 枚举类型定义的变量 )。

2.数组名并不完全等价于指针常量。依据: sizeof(数组名)等于数组大小, 而sizeof(指针常量)等于4字节(32位平台)或8字节(64位平台)

小结:
放弃"指针常量"这种看似精简实则简陋的中文描述吧!
我们应该使用英文来描述:

Pointer to constant:
const int *ptr;
int const *ptr;W Constant pointer to variable:
int *const ptr; constant pointer to constant:
const int *const ptr;

.

放弃"指针常量"这种不严谨的中文描述!深度理解数组名、指针常量的更多相关文章

  1. c语言 数组名是常量指针

    //数组名是常量指针 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include ...

  2. 【C/C++】一道试题,深入理解数组和指针

    在x86平台下分析下面的代码输出结果 int main(void) { ] = {, , , }; ); ); printf(], *ptr2); ; } &a+1 首先明确,a是一个具有4个 ...

  3. C语言深度剖析-----数组与指针分析

    数组的本质: 指针的运算: 小标VS指针: a和&a的区别: 例: 数组参数: 所以下例返回4 指针和数组的对比小结:

  4. C语言核心之数组和指针详解

    指针 相信大家对下面的代码不陌生: int i=2; int *p; p=&i;这是最简单的指针应用,也是最基本的用法.再来熟悉一下什么是指针:首先指针是一个变量,它保存的并不是平常的数据,而 ...

  5. C/C++数组名与指针的区别详解

    1.数组名不是指针我们看下面的示例: #include <iostream> int main() { ]; char *pStr = str; cout << sizeof( ...

  6. C++ Primer 随笔 Chapter 4 数组和指针

    1.数组:数组是由类型名.标识符和维数组成的符合数据类型,类型名规定了存放在数组中的元素类型,维数规定数组中包含元素的个数而标识符就是数组的名称.例如: int  arr[10]; 其中 int 是类 ...

  7. 数组名和指针的深入理解(C++)

    指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用.于是乎,很多程序设计者就被搞糊涂了.魔幻数组名请看程序(本文程序在WIN32平台下编译): #includ ...

  8. C++数组与指针

    指向数组元素的指针 一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址.指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中) ...

  9. c/c++数组名和指针区别深入探索

    指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用.于是乎,很多程序设计者就被搞糊涂了.而许多的大学老师,他们在C语言的教学过程中也错误得给学生讲解:&quo ...

随机推荐

  1. Vue基础(三)---- 组件化开发

    基本结构: ◆1.组件化开发思想 ◆2.组件注册 ◆3.Vue调试工具用法 ◆4.组件间数据交互 ◆5.组件插槽 ◆6.基于组件的案例   ◆1.组件化开发思想 优点: 提高开发效率 方便重复使用 简 ...

  2. Python测试函数运行时间

    import time import datetime # 测试函数运行时间 def cal_time(fn): """计算性能的修饰器""" ...

  3. 快速解决Ubuntu/linux 环境下QT生成没有可执行文件(application/x-executable)

    快速解决Ubuntu/linux 环境下QT生成没有可执行文件(application/x-executable)(转载)   问题描述 与windows环境下不同,linux选择debug构建时并不 ...

  4. vue项目配置vuex

    在vue项目中各组件之间传值非常的好用,但是当组件数量多的时候,就会感觉到多个组件之间传值就会变的非常痛苦.因此就需要使用vuex来管理数据值,这样在任何页面不需要传值过来的情况下就可以拿到我们想要的 ...

  5. WebRTC的VAD 过程解读

    摘要: 在上一篇的文档中,分析unimrcp中vad算法的诸多弊端,但是有没有一种更好的算法来取代呢.目前有两种方式 1. GMM   2. DNN. 其中鼎鼎大名的WebRTC VAD就是采用了GM ...

  6. 使用echarts 轻松搞定各种后台数据统计

    之前接到老大一个需求,需要将公私生态系统构建一个日志系统,统计公有云.私有云还有其他工具平台(如禅道,jenkins)的用户登录信息,并使用图标的形式动态显示,之前刚入门的时候接触过echarts 这 ...

  7. Sorting It All Out (拓扑排序+思维)

    An ascending sorted sequence of distinct values is one in which some form of a less-than operator is ...

  8. 石子合并(区间dp典型例题)

    Description 有n堆石子排成一行,每次选择相邻的两堆石子,将其合并为一堆,记录该次合并的得分为两堆石子个数之和.已知每堆石子的石子个数,求当所有石子合并为一堆时,最小的总得分. Input ...

  9. js转换人民币金额 小写到大写

    u.bigNum=function(n) { var fraction = ['角', '分']; var digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒 ...

  10. Mybatis参数传递及返回类型

    mybatis参数传递: 单个参数:不做特殊处理        #{参数名}:取出参数值    多个参数:做特殊处理        多个参数会被封装成一个map            key:para ...