C++学习——第7章 指针(上)

1. 概念

指针:一个可用于存储内存地址的变量。

指针不仅仅是“指针”,还表示了数据项的类型。

声明:

long* pnumber;        或者 long * pnumber;              再或者 long*pumber;

用第一个,对类型“指向long”的表达更清晰一些。但是,在同一个语句中混合使用一般的变量和指针的声明时,可能会产生混淆。如:

long* pnumber, number;

所以,一般写成:long *pnumber, number;          //声明一个指针,和一个long变量。

 

2. 使用指针

A. 地址运算符

地址运算符 &,是一个一元运算符,他可以获取存储变量的内存地址。

如:long number = 12345l;

long* pnumber;

因为变量number的类型和指针pnumber的类型是兼容的,所以可以进行如下赋值:

pnumber =&number;

也就是说,把number的地址赋予了pumber。

可以使用&运算符获取任何类型的变量地址。但必须在对应类型的指针中存储该地址。

如:如果要存储double变量的地址,指针必须声明为类型double*,即“指向double”。如果在类型错误的指针中存储了地址,程序就不会编译。

 

B. 间接运算符

         间接运算符 *,它和指针变量一起使用,访问指针所指向的内存位置的内容。(访问指针所指向的内存位置的数据的过程称为“解除指针的引用”)

         要访问指针pnumber指向的地址中的数据,可以使用表达式*pnumber。下面看代码:

#include <iostream>
using namespace std;

int main()
{
	long number = 50L;
	long *pnumber;
	pnumber = &number;
	cout << endl
		 << "The value stored in the variable number is "
		 << *pnumber
		 << endl;
	return 0;
}

C. 为什么使用指针?

①.可以使用指针记号操作存储在数组中的数据,这常常比使用数组表示法快一些。

②.定义自己的函数时,可以在函数中访问在该函数外部定义的大块数据。

③.可以动态地为新变量分配内存空间。



3. 指针的初始化

使用未初始化的指针甚至比使用未初始化的一般变量和数组更危险。如果指针变量包含个垃圾值,就可能覆盖内存的某个随机区域。因为造成的伤害仅取决于运气,所以一定要使指针初始化。

int number = 0;

int* pnumber = &number;

用另一个变量初始化指针时,必须在声明指针之前声明变量。否则,编译器就会产生错误。

当然也可以不用指定变量的地址来初始化指针。

int* pnumber = 0;

 

把指针初始化为char类型:

char* pproverb = “A miss is as good asmile. ”;

这个语句看起来非常类似于用字符串字面量出事话char数组,但是它们是完全不同的。这个语句利用引号中的字符串创建了一个非空字符串(实际上是const char类型的数组),并把字符串字面量中第一个字符的地址村春在指针pproverb中。

问题出现了,字符串字面量的类型是const,但指针的类型不是const。如果编写一些代码来修改该字符串:

*pproverb = ‘x’;

编译器会编译,找不出错误,因为指针不是const类型。但是程序运行后会产生错误,因为字符串字面量仍是一个常量,不能修改。

为什么编译器允许给非const类型赋予const值,但运行代码会产生错误。原因是字符串字面量仅在C++标准下是常量,而且有许多以前的代码依赖于“不正确的”赋值。

所以正确的用法:

const char* pproverb = “A miss is as good as a mile. ”;

这样其类型就与字符串字面量的类型一致了。


幸运之星:

#include <iostream>
using namespace std;

int main()
{
	const char* pstar1 = "Mae West";
	const char* pstar2 = "Arnold Schwarzenegger";
	const char* pstar3 = "Lassie";
	const char* pstar4 = "Slim Pickens";
	const char* pstar5 = "Greta Garbo";
	const char* pstar6 = "Oliver Hardy";
	const char* pstr = "Your lucky star is ";

	int choice = 0;

	cout << endl
		 << "Pick a luck star!"
		 << "Enter a number between 1 and 6: "
		 << endl;
	cin >> choice;

	cout << endl;

	//数组被6个指针(pstar1到pstar6)代替了。
	switch(choice)
	{
	case 1:
		cout << pstr << pstar1;
		break;
	case 2:
		cout << pstr << pstar2;
		break;
	case 3:
		cout << pstr << pstar3;
		break;
	case 4:
		cout << pstr << pstar4;
		break;
	case 5:
		cout << pstr << pstar5;
		break;
	case 6:
		cout << pstr << pstar6;
		break;
	default:			//输入不正确的值的情况。
		cout << "Sorry,you haven't got a lucky star.";
	}

	cout << endl;
	return 0;
}

指针数组:

#include <iostream>
using namespace std;

int main()
{
	const char* pstars[] = {
								"Mae west", "Arnold Schwarzenegger", "Lassie",
								"Slim Pickens", "Greta Garbo", "Oliver Hardy"
							};
	const char* pstr = "Your lucky star is ";
	int choice = 0;

	const int starCount = sizeof pstars/sizeof pstars[0];		//求得数组长度

	cout << endl
		 << "Pick a lucky star!"
		 << " Enter a number between 1 and "
		 << starCount
		 << ": ";
	cin >> choice;

	cout << endl;
	if (choice >= 1 && choice <= starCount)		//大于零且小于数组长度
		cout << pstr << pstars[choice-1];
	else
		cout << "Sorry, you haven't got a lucky star. ";		//输入错误,则没有幸运星
	
	cout << endl;
	return 0;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值