前言:大家好,我是老老老老颓。在初学C语言之时,我们辅导员告诉我们,学好指针才能体现出科班生与“野路子”的差距。今天,我就带大家初步地了解一下指针和一些学习的方法。
一、什么是指针?
指针是C语言的重要概念,是C语言最灵活分部分,但同时也是C语言学习中的一个难点,如果我们能学好指针也便是掌握了c语言的精华。
指针的概念:指针与内存有着密切的联系,而要弄清楚计算机系统中数据存储和读取的方式就需要分清三个较为相近的概念:名称、地址、和内容(值)。名称是给内存空间取的一个容易记忆的名字;内存中每个字节都有在地址所对应的内存单元中存放的数值即为内容或值。在计算在存储器中的。一般把存储器中的一个字节称为一个内存单元内存单元数不等,若在程序中定义了变量,在对程序进行编译配与变量类型相符合的相应长度空间的内存单元。要知道指针的概念,要先了解变量在内存中如何存储的。在存储时,内存被分为一块一块的。每一块都有一个特有的编号。而这个编号可以暂时理解为指针,就像酒店的门牌号一样。
酒店房间的门牌号(地址)酒店房间里的人(内容)酒店房间的名字有比如总统套房,商务房(名称)
我们找一个酒店里的房间,既可以按它的名字(名称)找,也可以按它的房间号(地址)找。
类似地,对于一个储存空间的访问既可以指出它的名称也可指出它的地址。
二、指针变量
1.指针变量的定义
C语言规定,所有的变量在使用之前都要进行定义,指定其类型,并按此分配单元。但指针变量不同与,我们之前所学到的int、char等变量,指针变量专门用于存放地址。这个地址不仅可以是变量的地址,也可以是数据结构的地址。所以我们在定义指针变量时应包含以下三个方面:
(1)指针类型说明,即定义变量为一个指针变量;
(2)指针变量名;
(3)指针值所指向的变量的数据类型;
其一般形式为:类型说明符*变量名;
注:*表示这是一个变量;变量名即定义的指针变量名;类型说明符表示本指针变量所指向的变量的数据类型。
eg:
至于p0究竟是指向哪一个整型变量,应由p0赋予的值来决定。
eg:
#include<stdio.h>
int main()
{
int*p0;//表示p0是一个指针变量,它的值是某个整型变量的地址,或者说p0指向一个整型变量。
int*p1;
float*p2;
char*p3;
}
如上:不同类型的变量可存放不同类型的指针的地址。
注:以上的指针变量名为p0,p1,p2,p3,而不是*p0,*p1,*p2,*p3!!!
2.指针变量赋值
同其他普通变量一样,指针变量在使用之前不仅要定义说明还要具体地赋值,否则会造成系统的混乱,甚至死机。在赋值即初始化时,也可以赋值“NULL”或“0”,如果赋值“0”,此时的“0”含义并不是数字“0”,而是 NULL 的字符码值。
假设有指向整型变量的指针变量p,若要把整型变量a的地址赋值给p,有以下两种方法:
(1)指针变量初始化的方式
int a;
int*p=&a;
(2)赋值语句的方式
int a;
int*p;
p=&a;
以上两种方式都把变量a的地址给到了指针变量p中,这时p就指向了变量a。但也有所区别;
取地址运算符&:单目运算符&是用来取操作对象的地址。例:&i 为取变量 i 的地址。对于常量表达式、寄存器变量不能取地址(因为它们存储在存储器中,没有地址)。
指针运算符*(间接寻址符):与&为逆运算,作用是通过操作对象的地址,获取存储的内容。例:x = &i,x 为 i 的地址,*x 则为通过 i 的地址,获取 i 的内容。
1.在指针变量的初始化中,不允许直接把一个数赋予指针变量,如下:
int*p;//定义
p=100;
这是错误的!
2.赋值的指针变量前不能再加“*”说明符;
*p=&a
这是错误的!
3.指针的类型和指针所指向的类型
只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看下面中各个指针的类型:
(1)int*p;//指针的类型是int*
(2)char*p;//指针的类型是char*
(3)int**p;//指针的类型是int**
(4)int(*p)[3];//指针的类型是int(*)[3]
(5)int*(*p)[4];//指针的类型是int*(*)[4]
什么是指针的指向型呢?
(1)int*p; //指针所指向的类型是int
(2)char*p; //指针所指向的的类型是char
(3)int**p; //指针所指向的的类型是int*
(4)int(*p)[3]; //指针所指向的的类型是int()[3]
(5)int*(*p)[4]; //指针所指向的的类型是int*()[4]
指针的类型和其指向的类型是有所区别的,在学习的过程中我们一定要认真区分。
今天的知识就分享到这里,最后留一道简单的题目:使用指针访问数组元素。
eg:
#include <stdio.h>
int main()
{
int data[5], i;
printf("输入元素: ");
for(i = 0; i < 5; ++i)
scanf("%d", data + i);
printf("你输入的是: \n");
for(i = 0; i < 5; ++i)
printf("%d\n", *(data + i));
return 0;
}
关于指针的知识接下来也会为打家持续分享。
(菜鸟新人,不喜勿喷)