C++学习日记14——指针的概念、用法及实例

在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;
}


    
    



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值