一句话总结:指针就是内存单元的编号。
1. 内存单元
在计算机中,所有数据皆由二进制数字0和1组成。
存一个0或者一个1的空间称作一个二进制位或者一个比特(由bit这个单词音译而来,bit全称为binary digit 或者 binary unit)
我们将八个二进制位作一个单位,这一个单位就叫做字节。
没错,一个字节等于八个二进制位,八个二进制位为一个字节。
在内存世界中,字节还有另外一种称呼,即内存单元。
内存世界中的一个字节就是一个内存单元,一个内存单元就是一个字节。
2. 内存单元如何区分
内存世界以内存单元(8个二进制位、一个字节)为基础单位,从0开始编号,编号最大到哪,那得看内存世界的大小,是4G、8G、16G或更大的G。
内存世界用内存单元的编号来标识内存单元,内存单元的编号,又被称作内存地址。
下面有个示意图,简单感受一下。每八个二进制位就是一个内存单元,每个内存单元都会有个编号,编号从0开始。图中每八个二进制位用不同的色彩进行区分。
清楚了上述内容,指针就不在话下了。
3. 认识指针
指针就是内存单元的编号,就是内存单元的地址。
4. 指针用来干什么
指针用作空间转移。比如你在100号内存单元,该内存单元里存储着38号内存单元的指针(就是38,不过以二进制的形式体现),那么你就可以去38号内存单元,并读取出其内容。
代码展现:
#include<stdio.h>
int main(int argc,char * argv[])
{
char love='S';//这里的变量love相当于38号内存单元
char * p=&love;//这里的指针变量P相当于100号内存单元
puts("我们看看p这个字符指针变量里存了什么东西");
printf("p=\t%p\n",p);
puts("我们看看字符变量love的内存指针");
printf("&love\t%p\n",&love);
puts("原来,字符指针变量p\t里面存放的是\t字符变量love的指针\n");
puts("通过变量名love访问字符变量love");
printf("love=\t%c\n",love);
puts("通过字符指针变量p访问字符变量love");
printf("*p=\t%c\n",*p);
puts("原来访问某个变量,除了自身的变量名外,还可以通过指针变量去访问它");
}
5.指针的简单使用
后面以字符指针变量为例,为大家演示指针的使用
这里一定要弄清楚指针和指针变量
指针:内存单元的地址,内存单元的编号
指针变量:存储内存单元地址的变量,存储内存单元编号的变量
5.1声明指针变量
#include <stdio.h>
int main(int argc,char * argv[])
{
//声明一个指针变量,以字符指针变量为例
char * p1;
return 0;
}
5.2为指针变量赋值
#include <stdio.h>
int main(int argc,char * argv[])
{
//声明一个指针变量,以字符指针变量为例
char * p1;
//定义一个字符变量
char k='Y';
//为指针变量p1赋值 &k是取出k所在空间的指针
p1=&k;
//输出字符指针变量中的值
printf("p1= %p\n",p1);
return 0;
}
5.3通过指针变量读取其所指向变量的值
#include<stdio.h>
int main(int argc,char * argv[])
{
//声明一个指针变量,以字符指针变量为例
char * p;
//定义一个字符变量
char k='Y';
//为指针变量p赋值 &k是取出k所在空间的指针
p=&k;
//输出字符指针变量中的值
printf("p= %p\n",p);
//通过指针变量p访问字符变量k ,*p 表示从自身的空间转移到 k 所在的空间,就可以访问变量k
//下面将输出 Y
printf("k= %c\n",*p);
return 0;
}
5.4通过指针变量修改其所指向变量的值
#include<stdio.h>
int main(int argc,char * argv[])
{
//声明一个指针变量,以字符指针变量为例
char * p;
//定义一个字符变量
char k='Y';
//为指针变量p赋值 &k是取出k所在空间的指针
p=&k;
//输出字符指针变量中的值
printf("p= %p\n",p);
//通过指针变量p访问字符变量k
//*p 表示从自身的空间转移到 k 所在的空间,就可以访问变量k的值
//下面将输出 Y
printf("k= %c\n",*p);
//通过指针变量修改字符变量k的值
*p='L';
//此时k的值应为 L
printf("k= %c\n",k);
return 0;
}
5.5 指针变量在内存中所占的大小
这里让代码说话吧!
代码:
#include <stdio.h>
//结构体student
struct student {
char identity[32];
char name[16];
int gender;
int age;
};
int main(int argc, char *argv[]) {
//声明基本数据类型的指针变量
char * char_pointer;
short * short_pointer;
int * int_pointer;
long * long_pointer;
float * float_pointer;
double * double_pointer;
//声明结构体类型的指针变量
struct student * student_pointer;
//输出每种指针变量所占空间的大小
printf("sizeof(char_pointer)= %d\n",sizeof(char_pointer));
printf("sizeof(short_pointer)= %d\n",sizeof(short_pointer));
printf("sizeof(int_pointer)= %d\n",sizeof(int_pointer));
printf("sizeof(long_pointer)= %d\n",sizeof(long_pointer));
printf("sizeof(float_pointer)= %d\n",sizeof(float_pointer));
printf("sizeof(double_pointer)= %d\n",sizeof(double_pointer));
printf("sizeof(student_pointer)= %d\n",sizeof(student_pointer));
return 0;
}
运行展示:
由运行结果可知:任何类型的指针变量,均占8个字节。
6.总结
抛开语言来说,指针就是内存单元的地址,就是内存单元的编号。有了指针,我们就可以通过C语言这个工具去访问指定内存单元,修改指定内存单元的值。由于指针存储于指针变量当中,就可以由指针变量作空间转移。例如:char x='L'; char * p=&x;我们就可以通过指针变量p转移到变量x的空间,具体做法是在指针变量p前面加上*,*p就完成了一次空间转移。