C语言,数组名,指针常量和常量指针

自己给自己劝退一波~

先介绍指针常量和常量指针

const  int *p;   //这是个指针常量

int const* p;  //这是个常量指针 

const是常量修饰符,被修饰的就是一个常量,常量的特性就是不能改变。

先介绍指针常量,

const int *p;
int   i=2;
p=&i;

 这里*p就是一个常量,他的值不能改变,也就是不能再通过*p=1; 这样赋值而去改变 i 的值,但可以通过直接i=1;这样改变i的值,此时*p的值也相应变为了1

int const* p=NULL;
int i=1;p=&i;

常量指针顾名思义,可以认为指针是常量,常量指针只能被赋值一次,指针的值不能改变后面再进行赋值会报错,不过第一次赋值NULL,让它成为空指针是允许的,因为空指针很特殊。*p的值可以改变

这里有个值得注意的地方

#include <stdio.h>
int main()
{
	const int i=10;
	int *p;
	p=(int *)&i;
	*p=100;
	printf("%d\n",i);
	return 0;
}

这段程序,在某些编译器里是可以改变 i 的值的,而某些不能。。。看情况吧,不过在c++里是肯定不允许改变的,应该会直接报错

前面介绍指针常量和常量指针是为了介绍下面的数组名,从这篇文章中得到的思考  https://zhuanlan.zhihu.com/p/24799071?iam=83d196fe2b966cf160601b3be0de2003&utm_source=com.tencent.tim&utm_medium=social

...其实这个我还是不是很懂,它的意思就是数组名不是指针常量,因为数组的官方定义里没有const修饰,我给出自己的理解

如果数组名是指针常量,那么为什么不可以进行++,--操作?

数组本身就是一种类型,所以数组名不是指针

而进行取内容运算时,数组名就会隐式转换为指针      //隐式转换,像char  str=97;而%c输出str,得到的是a,这样子

二维数组递推,实际上就是元素类型是数组的数组  //有点绕,但思维就这样的,看个人的逻辑思维理解能力,反正我是不太懂(ノ ̄д ̄)ノ

关于指针的左值和右值是什么,这里就简单说下

int a = 10,b;
int *d ;
d = &a; //d位于左边,表示的是存储d这个指针变量本身的内存地址。
b = *d; //d位于右边,表示的是d 表示的是存储变量a的内存地址。*d就是得到了a内存地址里a的值

  

原文地址:https://www.cnblogs.com/GH-D/p/8290351.html

时间: 2024-10-09 07:40:50

C语言,数组名,指针常量和常量指针的相关文章

[skill] C语言数组名到底是个啥

1. 正常情况下,数组名是个地址常量. 2. sizeof(数组名)的时候,数组名就代表数字名,其类型为 type array[], 返回数组元素个数. 3. 除了2的情况以外,可以理解为一个指针常量 !? 参考: http://www.cnblogs.com/kalo1111/p/3285955.html http://c.biancheng.net/cpp/html/492.html

C语言——数组名、取数组首地址的区别(一)

目录: 1. 开篇 2. 论数组名array.&array的区别 3. array.&array的区别表现在什么地方 4. 讨论 5. 参考 1.开篇 很多博客和贴吧都有讨论这个话题,各有自己的表述方式,今天在他们的基础上我将继续试着以我自己理解的方式总结一下,欢迎大家的审阅和指评. 2.论数组名array.&array的区别——省政府和市政府的区别 例如: int array[5] = {0}; 总所周知,其中的&array是整个数组array的首地址,array是数组首

【转】C语言-&gt;数组名与指针

以下内容转自: http://bbs.csdn.net/topics/390733584 感觉对自己有用,收藏了.如果转帖,请注明如上出处.多谢! 看到一篇关于C语言指针的文章,正好最近在看<C和指针>就去看了一下.<一道 C 语言指针访存题目的引申>,里面的第一个题目就把我难住了. 帮助123456789 #include <stdio.h>   int main() {     int a[5] = {1, 2, 3, 4, 5};     int *pa = (i

C语言 数组做函数参数退化为指针的技术推演

//数组做函数参数退化为指针的技术推演 #include<stdio.h> #include<stdlib.h> #include<string.h> //一维数组做函数参数退化为指针的技术推演 void printfA(char * strarr[3]); //计算机中,数组都是线性存储,二维数组元素也是一个个的排列的 //例如: 1,2,3,4,5,6,7,8,9 像这组数据 我们可以认为是一维数组 int a[9]={1,2,3,4,5,6,7,8,9}; //也

C语言数组篇(五)多级指针和二维数组指针的区别

多级指针 以二级指针为例 二级指针的由来是 指针数组 的指针形式. int *p[10] 读取的顺序是 p[10] --> 10个空间的数组 * p[10] --> 这10个空间的数组里面存放的数据都是 指针型的数据 int *p[10] --> 数组里面每个指针指向的空间存放的是int型的数据 int *p[10] --> int **p; p: 指针数组的数组名,也是数组的首地址. *p 数组里面存放的指针 **p 数组里面存放的指针 指向的空间 的内容 二维数组指针: 二维数

c语言数组做函数参数退化为指针

我的系统是MAC OS 64位.根据自己的系统位数不同是有差异的.以下是我学习过程中遇到的问题 大侠略过... 有时候我们想通过一个函数对数组的元素进行操作,在sizelen函数中想想通过sizeof获得数组的长度. 想法是好的,不要以为你对C语言很了解了.其实数组在做函数参数是只是传了,一个指针.也就是数组 的首地址. 从结果可以看出,C编译器确实是这么做得.我的系统是64位,所以int *是占8个字节. 以上只是我学习过程中遇到的问题.大侠略过...

第二章 数组名是一个指针常量吗?

数组名是一个指针常量这种观点来源于数组名在表达式计算中与指针的结果等效性.例如下面的代码: int a[10], *p = a, *q; q = a + 1; q = p + 1; 在效果上看,a + 1与 p + 1是相同的,这很容易给人一种a就是p的假象,但,这仅仅是假象.鉴于指针常量包含了指针和常量两类概念,我们可以把这个问题分开两部分进行讨论. 一.数组名是指针吗? 在<C与指针>一书中,作者用一个著名的例子阐述了数组名与指针的不同.在一个文件中定义:int a[10];然后在另一个文

C语言数组与指针

一维数组与指针 int a[10]; int *pa; 一维数组的数组名代表的就是该数组第一个元素的地址,所以复制语句pa=&a[0]等价于pa=a.对数组元素a[i]的引用等价于*(a+i).在计算数组元素a[i]的值时,C语言实际上先将*(a+1)后再进行求值,所以用指针编写的程序比用数组下标编写的程序执行速度快. 数组名和指针之间有一个不同之处,指针是一个变量,pa=a和pa++都是合法的.但数组名不是变量,因此,类似于a=pa和a++形式的语句是非法的. 当把数组名传递给一个函数时,实际

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

指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用.于是乎,很多程序设计者就被搞糊涂了.而许多的大学老师,他们在C语言的教学过程中也错误得给学生讲解:"数组名就是指针".很幸运,我的大学老师就是其中之一.时至今日,我日复一日地进行着C/C++项目的开发,而身边还一直充满这样的程序员,他们保留着"数组名就是指针"的误解. 想必这种误解的根源在于国内某著名的C程序设计教程.如果这篇文章能够纠正许多中国程序员对数组名和指针的误解,