指针
概念
指针是一个变量,它存储着各种数据类型的数据的地址,并且可以直接使用。
声明
指针的声明与变量略有不同(以名为a,数据类型为int的变量举例,值为零):
变量:
int a = 0;
而指针:
int *a = 0;
可以注意到,指针的声明比较变量来说,多了一个*。
*的使用
前面刚刚说过,*是用来声明指针的,这里又提到,不会有什么特殊用法吧?
还真有。
在声明时,*表示的是指针;但是在输出中,表示的是解地址符。
举例说明:
int main(){
char a = 'a';
char *p_a = &a; // 找到变量a的地址,存放到指针变量p_a中
printf("%c",*p_a); // *:解地址符
return 0;
}
比如这段代码,第一个*指的是名为p_a的指针,而第二个,也就是在printf中的,指的是解地址,获取的是变量a中的字符:a。并且输出指针要用**"%#X"**作为格式控制符。
+1问题
再来看下面这段代码:
int main(){
int a = 3;
int *p_a = &a;
printf("%#X",p_a+1);
return 0;
}
只见输出了p_a这个指针的地址+1的值,那么输出的是什么呢?(已知p_a为0X23FE44,0X是16进制的前缀)
是0X23FE45,对吧?好的,运行一下。
你应该运行出来是0X23FE48。如果不是,检查你的代码。原因也很简单,一个int占4个字节,而指针是存储地址的,所以自然要加上4。
+1问题2.0
你刚才一定被+1问题搞得不轻,那么,2.0来了。
用代码说话:
int main(){
int arr[5] = {0,6,2,3,1};
printf("%d",*(arr+1));
return 0;
}
我可以告诉你,输出的是6。没错,不要怀疑你电脑出问题了。
原因在这里:
数组名在指针中,表示着首元素。
明白了吧?
这就是基础指针的所有内容。头不大吧?不大就好,反正我头是大了。我是大头,下雨不愁。