前言
刚开始接触C语言,对C语言中的指针有一点不能理解,接着还有一个"&"符号感觉两者有点接近和混淆。两者的定义如下:
- &是取地址符号
- *是定义指针变量,即指向内存单元的指针
指针是C/C++语言的特色,它允许程序员直接操纵内存,所以说C语言是一种高效的语言。很多语言屏蔽了编程人员直接操纵内存的权限去降低软件开发的难度。
&
#include<stdio.h>
int main()
{
int a=20;printf("a 的值为%d\n",a);printf("a 的地址为%d\n",&a);return 0;
}
//打印结果:
a 的值为20
a 的地址为1703740(1703740为a地址0019FF3C的十进制)
& 符号的作用很清晰, &a就是取变量a的地址。
*
#include<stdio.h>
int main()
{
int a=20;int *ip;ip=a;printf("ip 的值为%d\n",ip);printf("*ip 的值为%d\n",*ip);return 0;
}
//打印结果:
ip 的值为20
为什么只打印了一个值呢?刚开始学习不是很懂,回去查指针变量的定义,再加上网上查阅各种资料,定义说:*表示一个指针变量,指向内存单元,指向内存单元,应该就是地址吧,那么ip变量应该被赋值一个地址,前边说的 & 不就表示一个地址吗,试一下
#include <stdio.h>int main ()
{
int a=5;int *b;b=&a;printf("a 的值为 %d\n",a);printf("&a 的值为 %d\n",&a);printf("b的值为%d\n",b);printf("*b 的值为 %d\n",*b);
}
//打印结果:
a 的值为 5
&a 的值为 1703740
b的值为1703740
*b 的值为 5
定义变量时int* a;int* 表示取指针,在地址前加*表示这个地址的内容。
函数指针和指针函数
函数指针
的定义:
returnType (*pointerName)(param list);
指针函数
的定义:
returnType *pointerName(paramlist);
returnType 为函数返回值类型,pointerNmae 为指针名称,param list 为函数参数列表,函数指针
赋值为函数地址。注意:( )的优先级高于*,第一个括号不能省略,如果写作returnType *pointerName(paramlist);就成了函数原型(指针函数
),它表明函数的返回值类型为returnType *,返回值类型为1个指针。
调用函数直接调用就好了,为什么还要定义一个函数指针呢,才接触时很不理解,后了解到由于函数指针存储的是一个内存地址,在传参的时候传入一个地址比传入一个地址对应的函数名更高效,运算速度更快。
数组指针
数组是一种结构类型,在某种意义上来说数组名就是指针,可以转化为指向其实体的指针,指针则是变量,仅仅意味着数组的存放地址,数组名概念比较宽泛,也更加复杂,而指针仅仅代表数组的首地址
#include <stdio.h>int main()
{
int a[]={
1,2,3,4,5};int *p=a;printf("数组a首地址%d\n",&a);//数组a首地址1703724printf("数组a首地址%d\n",p);//数组a首地址1703724printf("a所占空间%d\n",sizeof(a));//a所占空间20(a代表整个数组,大小为4*5=20)printf("*p所占内存空间%d\n",sizeof(p));//*p所占内存空间4(*p仅仅指向首地址)printf("*p指向地址的内容%d\n",*p);//*p指向地址的内容1return 0;}
指向指针的指针
#include<stdio.h>
#include<stdlib.h>int main(){
char *s[]={
"aaa","bbb","ccc","ddd"};char **p;//定义指向指针的指针int k;for(k=0;k<4;k++){
p=&s[k];//指针赋值为地址 如果不加则为s[k]的内容,会出错printf("%s\n",*p);//使用*p访问指针所指向地址的内容}return 0;}
总结
- &a表示a变量的地址,scanf("%d",&a)中&a就是将输入的值存入a变量的地址中
- *ip定义一个指针变量ip,ip代表指针变量,赋值内容为地址(即指向变量的地址)
- *ip表示值是地址的变量,访问的是ip地址内容
- 在数组中指针变量仅仅代表数组的首地址,数组名就数组的首地址