时间:2019-08-10 15:24:30 作者:Dorise 浏览量:99
什么是 C言语指针?
图一 怎样了解C言语中的指针,怎样运用
不同的数据类型的主要差异在于占用的存储空间不同。咱们知道,C 程序是运转在计算机的内存中的,因而 C 程序的变量也是存在于内存中的。C 标准规则 char 类型占用一个字节的存储空间,对其他整型却没有做规则,现在为了解说的便利,咱们假定 int 类型的数据占用内存 4 个字节。
假定咱们如下界说了两个变量:
signed char i = 3;int j = 8;
那么,i 占用了 1 字节的内存空间,j 占用了 4 字节的内存空间,方框表示内存空间,内部表示存储的值。咱们把内存逐字节编号,方框外部的数字表示方框的编号(这样的内存“编号”即所谓的“内存地址”)。修正变量 i 的值,实际上便是修正地址为 4000 的内存空间里的值。那反过来呢?假如我修正了地址为 4000 的内存空间里的值,i 的值会相应改变吗?答案是肯定的,请持续往下看,内存地址“4000”是我为了解说便利随意取的。那么,在实际应用中,变量 i 的地址怎样获取呢?C 言语供给了“&”运算符,便是获取变量地址的。请看下面的例子:
#include
int main()
{
signed char i = 3;
int j = 8;
long p1 = (long)&i;
printf(\\\"p1: %ld \\\",p1);
return 0;
}
咱们取出了 i 的地址,把它强制转换为 long 型(关于强制类型转换,可参阅上一节),传递给 p1 了。编译履行,发现变量 i 的地址被打印出来了。这说明,C 程序变量的地址也是一个整数。
依照上面的说法,修正 i 的值除了直接对 i 赋值以外,还能够经过修正 p1 地址处的内存空间里的数值。那,怎样才能“经过修正 p1 地址处的内存空间里的数值”修正 i 的值呢?
上面的代码实例中,咱们运用了 long 型变量 p1 存储了 i 的地址。事实上,C 言语有专门的数据类型存储地址,界说方式也很简单,便是:“类型描述符 * ”,例如,能够界说以下变量存储地址:
signed char *p1 = &i;int *p2 = &j;
p1 和 p2 便是 C 言语中所谓的指针类型,由于 i 是 signed char 类型的,所以界说了 signed char * 类型的指针存储 i 的地址。j 是 int 类型的,所以界说了 int * 类型的指针存储 j 的地址。别的,C 言语供给了“&”运算符取变量地址,与之对应的,还供给了“ * ”运算符从相应地址内存里取出数值。
好了,了解了 C 言语的指针类型和“ * ”运算符,现在来看看怎样“经过修正 p1 地址处的内存空间里的数值”修正 i 的值。请看如下代码:
signed char *p1 = &i;
*p1 = 5;
printf(\\\"i=%d \\\",i);
编译运转,发现程序输出“i=5”,这样咱们就完成了“经过修正 p1 地址处的内存空间里的数值”修正 i 的值。
在界说变量时,” * “放在变量符号前,能够界说指针变量。在界说完指针变量后,“ * ”放在变量前,就表示从地址取值的运算符了。别的,“ * ”还能够表示乘法运算符,读者自己思考什么情况下,“ * ”表示乘法运算符。
以上的操作,实际上便是 C 言语的指针操作,能够看出它一点也不奥秘,接下来几节,咱们将持续讨论 C 言语的指针,比方为什么 int 类型的变量 j 的地址要运用 int* p2; 界说,而不能运用 signed char* p2; 界说,运用指针为何能写出紧凑、高效的 C 程序等等。
为什么要运用指针?
在开始讨论为什么运用 C 言语指针之前,先介绍一下复杂点的指针,这是新知识,也是衬托。不想看衬托能够往后翻一翻。
前面几节介绍了 C 言语中指针,也讨论了数组指针和指针数组的差异,但归根结底,至今咱们说的都是根底数据类型界说的指针,C 言语有复合数据类型,那么它有复合数据类型的指针吗?答案是肯定的,事实上,在 C 言语中复合类型指针的运用相当广泛。