在C/C++中,指针的理解和使用是衡量你对该语言的掌握程度,加油不抛弃不放弃~
一、指针的概念
指针是一种数据类型,指针与内存单元的地址密切相关
内存——由内存单元构成,每个内存单元都有专属的地址,其是内存单元的编号;内存单元的内容——存放在内存单元的数据
在C/C++语言中,每个变量都分配由确定的内存空间。使用变量名可直接访问内存中的数据;通过变量的地址也可间接访问内存中的数据
特点:
1、指针本身就是一个对象
2、指针无须在定义时就赋初值
定义指针的方法:
类型+声明符,此处将声明符写成*d的形式,其中d是指针变量名,如int *p; char *ptr ,*ptr1;
注:*为解引用符;&为取址符
二、地址与指针
定义一个变量,系统按变量类型为变量分配不同数目的内存单元,将其第一个内存单元的地址作为变量的地址。如int a;
在C/C++中,允许定义一种特殊变量,用于存放某变量的地址,这种特殊变量即为指针。如int *p=&a; 表示为p->a,读作p指向a,即p存放的是指向a的指针,p为指针变量
结论:存放“地址”的变量称为指针变量,这里的“地址”就是指针,因此变量的地址就是变量的指针。
注:1、引用不是对象,没有实际地址,所以不能定义指向引用的指针。如int a; int &b=a; int *p=b;//这第三条语句出错
2、一般地,指针的类型要和它所指向的对象严格匹配,不过也有特殊情况(出现频率较少)。
三、指针类型的主要用途
1、参数传递:指针作参数可实现参数按引用传递的功能——比如形参改变实参。
2、动态分配:利用动态分配构建动态数组,动态数组需要借助指针实现。
3、数据结构:创建可伸缩的数据结构,如链表、栈与队列、树和图等。
4、多态处理:面向对象编程中“运行多态性”的处理是利用指针与引用实现的。
四、指针和变量的关系
变量与指针变量
变量有地址,指针变量可以存放变量的地址
当指针变量中存放某个变量的地址后,可以说该指针变量指向这个变量
使用指针变量的三个步骤
1、定义指针变量(即给指针变量分配内存空间)
数据类型 *变量名如:int *a;//a是一个整型指针变量 char *p;//p是一个字符型指针变量
2、指针变量的初始化(即指针变量指向某对象)
为指针变量提供初值 如int a=5,*p=&a; <=>int a=5; int *p=&a;//p的初值为a的地址
注:此处不可写成*p=&a,只能是p=&a;因为*p并不是表示指针变量,而是指针变量指向的变量a
3、通过指针变量间接访问所指向的对象
指针类型中,有两个特殊的单目运算符: &和*
(1)&——取地址运算符
(2)*——取值运算符
上述步骤1和2可以合并
五、函数与指针
一个函数在编译时被分配一个入口地址,这个入口地址就称为函数的指针,在C++中,函数名代表函数的入口地址。
1、指针作函数的参数——实现地址传递(间接传递),与引用作参数效果相同
2、返回指针的函数
定义格式如下:
类型 * 函数名(形式参数表)
{
语句序列
}
上述,类型 * ——为函数的返回值类型,是一个指针类型
3、指向函数的指针变量
使用指向函数的指针变量可以存放函数的指针。
定义格式如下:
函数返回值类型 (* 指针变量名)(形参类型表列)
注:上述两个括号不可以缺少
如:double (*pf)(double);
pf=sqrt;//pf指向一个平方根函数
这时,利用*pf调用该函数
如:cout<<(*pf)(2.0)<<endl;//输出根号2的值
六、实例分析
实例1:三个数排序——指针作为函数的形参
功能:输入三个整数,排成从小到大的顺序并输出
//对三个数排序,假设从小到大
//
#include
using namespace std;
void swap(int *i, int *j)
{
int temp;
temp = *j;
*j = *i;
*i = temp;
}
int main()
{
int a = 10, b = 11, c = 2;
cout << "未排序时的顺序\t" << a <<"\t"<< b<< "\t"<< c << endl;
if (a > b)
swap(&a, &b);
if (a > c)
swap(&a, &c);
if (b > c)
swap(&b, &c);
cout << "排序后的顺序\t" << a <<"\t"<< b <<"\t"<< c << endl;
system("pause");
return 0;
}
小结: 形参(自定义函数)<--实参地址(主调函数)
实参(主调函数)<--形参的值(自定义函数)
实例2:去掉字符串首部的空格——返回指针的函数
//编写程序,返回字符串中首次出现的非空格字符开始的字符串。
//注:返回字符串就是返回字符串的首地址
#include
using namespace std;
//返回字符指针的函数
char *noblank(char s[])
{
int k = 0, j;
while (s[k] == ' ')
k++;
j = k;
while (s[j] != '\0')
{
s[j-k] = s[j];
j++;
}
s[j - k] = '\0';
return s; //等价于return &s[0];
}
int main()
{
char str1[100] ;
cin.getline(str1, 99);
cout << "未处理的字符串:"<
<< endl;
cout << "处理后的字符串:" << noblank(str1) << endl;
system("pause");
return 0;
}
实例3:计算圆的周长和面积——函数的定义和调用
#include
using namespace std;
double Length(double r)
{
return 2 * 3.1415926*r;
}
double Area(double r)
{
return 3.1415926*r*r;
}
double Function(double(*f)(double), double x)
{
return (*f)(x);
}
int main()
{
double r, d_Length, d_Area;
cout << "请输入圆的半径: ";
cin >> r;
cout << "圆的周长:"<< Function(Length,r)<< endl;
cout << "圆的面积:"<< Function(Area, r) << endl;
system("pause");
return 0;
}