一.说到指针就先来说指针是什么,其实很简单,指针就是地址,那么地址是什么呢,地址——在计算机中存储数据的地方的编号的一个叫法,就像你家住在朝阳区369号一样。
平时数据在计算机中是这个样子存储的。
F00AB450 | ‘a’ |
F00AB451 | ‘0’ |
F00AB455 | 1 |
F000AB456 | ‘e’ |
字符类型占一个字节,整型占用四个字节。
二.怎么定义指针和指针的初始化。
1)定义
直接举例子:int *p;//这就是定义一个int型的指针,变量是p,数据类型是int*。
那么其他的数据类型定义也就是一样的了,如char* ch; struct DATE date * d;
其实指针是没有数据类型,之所以定义数据类型是因为在使用时不会出错,比如int *p;那我在调用时就是从内存中取四个字节,char *ch;就是从内存中取一个字节。这也解释了指针不同类型为何无法兼容的问题。
2)初始化
直接举例子:int a,*p=&a; 或者 int a,*p; p=&a;
这两种初始化方式都是将做了将p指向a的操作,在这里解释两个符号
*代表是一个标志,和类型说明在同一行。
&代表取址,就是获得变量的地址
三.指针的使用。
①用于修改变量
int a=3;
int *b=&a;
*b=23;//这里的*,不同上述的标志,不和数据类型在同一行,这个叫取值符号,获取指针变量里面存放的地址,取出那个地址所指向的变量的值,*b等价于a;
②用于函数
void funt(int a)
{
a=1000;//这样不可改变
}
void funt(int *c)
{
*c=1000;//这样可改变
}
int main()
{
int a=123;
//funt(a);
funt(&a);
printf("%d",a);
return 0;
}
ps:
1.变量名和函数名只是地址的一种助记符,当源文件被编译和链接成可执行程序后,它们都会被替换成地址。编译和链接过程的一项重要任务就是找到这些名称所对应的地址。
2.我们认为变量名表示的是数据本身,而函数名、字符串名和数组名表示的是代码块或数据块的首地址(其实严格的来说也不是,只是这样方便理解)。