嵌入式C语言内存操作之C语言指针修饰符

C语言指针修饰符const

概念

在我们了解了指针的基本概念之后,接下来我们来看一下指针和C中给我们提供的关键字中的类型修饰符它们之间的关系。指针就是存储地址的一种特殊变量。那这个变量跟我们的修饰符之间还有哪些更深层次的符号限制呐?我们在实际开发过程中,经常会运用修饰符,把指针的这种限制范围更明确的告诉给用户,通过不同修饰符告诉给用户指针的具体属性。

指针变量也是一个变量,它可以改变存储的地址,指向一个地方再指向另外一个地方;还可以改变指向地址的值;所以它可以有两个地方的改变。为了更好的去修饰一些特殊类型的指针,C提供给了我们三个关键字来修饰指针变量:

const关键字

Const我们知道他是只读性质的关键字,const修饰的变量就不能改变,成了常量。

1)const char *p;//这两种修饰方法是一样的,我们经常使用这种方法。都是修饰的char字符,它代表的是字符串的内容不可以更改。此时的指针依旧可以指向其它的内存,但是通过指针修改它指向的值就是不可以的了。

char const  *p;

2) char * const  p;//这两种修饰方法是一样的,我们经常使用这种方法。都是修饰的指针,它代表的是指针指向的地址不可以改变,而地址里面的内容是可以改变的。

char * p const;

 一般这种定义都是硬件资源的定义。比如显卡当中有一片缓存,显卡制造的厂家已经为我们焊好了缓存区域,我们如果需要操作这片缓存,我们需要找到缓存的地址,而这些地址是不可以改变的。这个固定地址就可以定义为不可改变地址的指针变量。

3) const char * const p; //指针的指向和指向的内容都不可以被改变。这个一般使用在Rom空间中。

Volatile关键字

Volatile就是防优化。Volatile一般和硬件有关,指向硬件的内容可能我们需要不要让编译器去优化,每次都要读取那里的内容。比如我们在实际操作中有一个键盘,我们查看一个按键是否被按下,就是通过读取内存里面关于按键状态的高低电平来识别。那么我们怎么来读取这一个位里面的状态(0或1)?我们能够访问到最小的内存地址就是一个字节,而一个字节里面有8个位。所以我们只能利用一个undsigned char*类型的指针来读取一个字节的内容,再通过位运算来获取到其中的某一位判断它的状态。这就是我们在硬件操作-软件操作于硬件的思路。这一个字节的内容是不是常量,它是由于硬件的状态来决定的,里面的内容可能被编译器优化掉,便于我们读写操作。Volatile主要与char *p结合。

volatile  char *p;
while( *p == 0x10 )  //我们可以假设它的状态是值的改变,当按键按下的时候值就变成这样,此时我们的循环体就是它执行的操作了。
xxxx;

Typedef关键字

Typedef是一个别名。在后期,我们需要指针可以指向所有的资源,有些资源类型的声明和读取是比较复杂的。也许我们看到指针的时候不能一眼就看出它的类型。比如下面这种指针使用方法:

int  (*p[10])(int ,void (*p)(int));

C语言不断的在描述内存属性,这些内存属性可以是函数,数组…..所以指针指向的类型是千奇百怪的。所以我们就采用Typedef把这些声明别名化。

char *name_t  :     //name_t是一个指针,指向了一个char类型的内存
typedef char *name_t;  // name_t是一个指针类型的名称,指向了一个char类型的内存
name_t abc;  // abc 是一个指针,指向了一个char类型的内存

可以看到有了别名之后,我们可以简化指针类型的声明和读取,这在我们后期学了函数之后,它的好处就体现出来了。

猜你喜欢

转载自blog.csdn.net/qq_38721302/article/details/82391524