当前位置:首页 > 软件开发 > 正文

常量指针的常量能不能修改,所有的数组名都是指针常量

常量指针的常量能不能修改,所有的数组名都是指针常量

其实常量指针的常量能不能修改的问题并不复杂,但是又很多的朋友都不太了解所有的数组名都是指针常量,因此呢,今天小编就来为大家分享常量指针的常量能不能修改的一些知识,希望可...

其实常量指针的常量能不能修改的问题并不复杂,但是又很多的朋友都不太了解所有的数组名都是指针常量,因此呢,今天小编就来为大家分享常量指针的常量能不能修改的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

C语言中文件指针如何定义如何指向文件

指针本身也是一种变量,有它自己的内存地址跟空间。const指针有两种形式type*constnametypeconst*name第一种为常量指针,不能修改指针指向的地址第二种为指向常量的指针,不能修改指针指向的内存地址里保存的数据

字符串常量可以放在字符串变量中吗

定义:括在一对双引号之内的字符序列或转义字符序列称为字符串常量。例如:“Howareyou!”“a”“*abc\n\t”它是不可以改变的.例如:char*p="nihao!";如果你试图改变指针所指向的内容是会报错的.例如:(*p)='h';//运行的话会报错因为字符串常量是放在静态存储区的,这部分内容是不能修改的。字符串变量:在c中是没有这个概念的,c中如果想将一个字符串存放到变量中,必须使用字符数组,就是用一个字符型数组存放一个字符串,例如:chardata[10]="china";这时候,这个字符数组存放了一个字符串,它是可以改变的,例如:data[0]='m';这种操作都是可以的。大概意思,就这些了,不清楚的可以hi我.

在定义数组时,数组大小必须是常量,不能使变量或变量表达式

intconstn=5;尽管n的值是常量5,不允许通过n改变,但是,并不等于n的值不能改变,实际上可以通过指针对其值进行修改,比如int*p=&n;*p=12;这样那个就修改了n的值(将&n赋值给p的时候编译器可能会发出警告),所以n是一个变量,是一个特殊的变量,被称为常变量。因此,n不是一个常量,只是一个不能通过n来修改其值的一个变量。所以不能用它来给定数组的大小。

C语言中,为什么字符串可以赋值给字符指针变量

修改:原来有“p=name[i]其实和p=name+i没有任何区别”一句,是不对的,name[i]是数组,其中name可以作为只读指针来看待,那么应该是*p=*(name+i)。name[i]相当于对指针这问题提的真好,理解这个问题了以后,对C语言指针的概念也就掌握了,而C语言最重要的就是指针。题主这重点抓的真到位,可谓纲举目张,擒贼擒王。p是一个变量,那么想怎么给它赋值,就可以怎么给它赋值,但是C语言是强类型语言,如果赋值类型不匹配就会报错,如果赋值类型虽然不匹配但是可以默认转换,那么编译可以通过但是会给警告。比如可以这样做:p=0;p=1;都没问题,因为p是一个指针,数字类型可以赋值给指针,但是给它赋值是什么含义?含义不对,即使编译通过,运行也会报错的。在第一个文件里存在一个错误是i没有初始化,必须初始化为0或者1或者什么数字,不然一定会出错,下面的讨论假设初始化为1:在第一个文件里面,p是一个变量,这个变量的类型是指针,这个指针所指向的是“字符串指针”。那么既然是变量,就可以读和写,所以可以赋值;由于是强类型,所以只要是指针类型或者能转换成指针类型的就可以赋值;由于它是一个指向”字符串指针“的指针,所以给它赋值的时候,如果所赋值对象类型不是指向”字符串指针“,一般编译器都会提示一下的。name也是一个变量,这个变量的类型也是指针,这个指针所指向的是”字符串数组“。在C语言里面,数组其实就是指针,但是是常量,不能写,只能读,所以name这个变量可以读可以写,但是它指向的内存因为是常量数组所以只能读不能写,除此以外name和p没有任何区别。因此,name+i是指针加法,name+i还是一个指针,指向字符串数组,只不过所指内容和name不一样,是name的”下一个“,所以p=name+i属于两个同类型指针赋值,没有任何问题;p=name[i]和p=name+i是不一样的,name定义为一个数组,name[i]是取数组的第i个元素,相当于*(name+i)。(感谢

@单车恋人

指正)但是这个赋值还是会成功的,因为p是指向字符指针的指针,本质还是一个指针,name是一个字符指针的数组,取出的第i个元素是一个字符指针,赋值可以成功,但是类型不一样(字符指针的指针和字符指针)。p=*name+i性质就变了,就是把name所指向的内容加1,然后赋值给p,name作为一个指针指向的是字符串数组,还好字符串数组也是指针(指针与数组在C语言里面都按照指针处理),所以赋值可以成功,但是会给出编译警告,因为毕竟他们不是相同类型,p是指向指针的指针,赋值内容是数组,相当于指针。*p=name+i在这里name+i和前面的分析一样,它和p是相同类型,是指针的指针;而*p是一个指针了,这时候要把它赋给*p还是指针之间的赋值,编译可以通过,但是指针类型不同,也会给出编译警告。这里要注意,p是一个变量没问题,但是*p能不能赋值取决于p指向的空间,如果p指向一块可读不可写的内存,程序运行到这里会运行时退出;如果p指向一块可写的内存而且有足够的空间,那么就没问题。抱歉第二个文件就不这样详细分析了,没想到这么长太累了,不过思路是类似的。写了段代码供参考,用的是64位Linnux下Gcc编译器,所以打印指针的时候转换成long类型,如果是32位转换成int类型,这里p指向的是一块不可写内存,所以在*p=name+i那里会运行时报错:

c语言指针可以指向枚举类型吗

C语言指针用法灵活,基本类型指针,

通用指针void*

指针数组和数组指针

函数指针和指针函数

结构指针和联合指针

枚举指针

指针常量和常量指针

指针的指针

基本类型指针

指向整型和浮点型的指针。包括char,int,float,double类型指针

通用指针

void*声明一个通用指针,该指针可以和除函数指针类型之外指针类型相互转换。

例如:

void*p;

int*ip;

p=ip;

ip=p;

指针数组和数组指针

指针数组:指针数组的每个元素都是指针类型。

例如:

//ip是数组类型,数组中每个元素是int型指针。

int*ip[];

//fp是数组类型,数组中每个元素是float型指针。

float*fp[];

数组指针:指针类型,指向数组。

例如:

inta[100];//声明和定义数组a

int*pa=a;//声明指针pa,并且将数组a的首地址赋值给pa

inta1=*(pa+1);//获取数组a第2个元素的值,即a[1]的值

注:数组名本身就是当做地址常量赋值给指针,不需要&地址运算符。

函数指针和指针函数

函数指针指向特定函数类型的指针。

例如:

//fp是指针,指向返回值为int型,有1个int型参数的一类函数

int(fp)(int);//fp是指针,指向返回值为double型,有2个double型参数的一类函数double(fp)(double,double);

//fp是指针,指向返回值为int型指针,有1个int型参数的一类函数

int(fp)(int);

注:指针函数是指返回值为指针类型的函数,本质上是函数类型;函数指针是指向函数类型的指针,本质上指针类型。

结构指针和联合指针

指向结构类型、联合类型的指针。

例如:

struct

枚举指针

指向枚举类型的指针。

例如:

enum

指针常量和常量指针

指针常量:指向常量的指针,指针本身是变量。

例如:

constintp=1;//定义常量p

constint*ptr=&p;//ptr是指针,指向constint*常量int型

inti=2;

p=i;//此时出错,不能给常量赋值

ptr=&i;//正确,ptr是指针变量,可以赋值

常量指针:指向变量的指针,指针本身是常量。

例如:

intp=1;//定义变量p

intconstptr=&p;//ptr是指针常量,指向变量int型

inti=2;

p=i;//正确,p是变量

ptr=&i;//错误,ptr是常量指针

指针的指针

C语言支持多重指针,即指向指针的指针。

例如:以下都可以输出变量i的值。

#include

输出结果:

10

c语言中怎么让一个变量不变

定义变量后,如果不初始化变量,会导致生成随机值。所以,把变量初始化,或者放在全局作用域中也是可以的。

如果是定义“常量指针”(即不能改变所指对象的指针)的话,需要注意顶层const与底层const的区别。

在算法中常会见到让变量恢复初始值的情况,如dfs(深度优先搜索)中的回溯就是典型。

如果是数组的话,可以用memset来初始化。

用以上这些,实现c语言让一个变量不变的。

关于常量指针的常量能不能修改和所有的数组名都是指针常量的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

最新文章