一、基础
除了寄存器变量以外,程序中的所有对象都存储在内存中的某处,“某处”有一个地址,在开发平台上内存的每个字节的序号按顺序从0开始,简单的说,地址就是一个字节的顺序号。
//pint.cpp
#include <cstdio>
#include <iostream>
using namespace std;
void main()
{
int i = 7;
int j = 8;
printf("i==%d,&i==%p\n", i, &i);
cout << "j==" << j << "&j==" << &j << endl;
}
单目运算符&返回一个数据对象的地址。%p格式控制符根据编译器格式的不同来显示地址,通常是十六进制形式。
指针只不过是一个容纳另一个程序实体地址的变量。
由于指针总是指向某种类型的对象,因此被引用类型通常必须出现在声明中,这样,我们说“指向整形”或者“指向字符型”,声明如下:
**int *ip;
说明了*ip是一个整型变量,因此ip是一个指向整型变量的指针。在**声明语句之外的表达式中如果指针变量前有星号,结果表示指针变量所指向变量的值。
说明指针喝间接访问:
#include <iostream>
using namespace std;
void main()
{
int i = 7, j = 8;
int* ip = &i;
int* jp = &j;
cout << "address" << ip
<< "contains" << *ip << endl;
cout << "address" << jp
<< "contains" << *jp << endl;
*ip = 9;
cout << "now address " << ip
<< "contains " << i << endl;
*jp = 10;
cout << "now address " << jp
<< "contains " << j << endl;
}
任何时候都不要忘记指针不仅仅是指向内存中的某处,还指向某种类型的实体。
指针是一种独特的数据类型并且应该作为一种独特的数据类型来看待。可以对指针进行如下操作:
1.在指针中存储和从其中读取被引用类型的对象的地址;
2.改变或读取该地址中的内容(间接访问);
3.在指针上加或者减一个整数(仅限在数组中使用);
4.与另一个指针相减或做比较(当两个指针都指向同一数组时);
5.给指针赋值或把它和空指针做比较;
6.作为参数传递给函数,该函数期望一个指向引用类型的指针作为参数。
指针原则1:指针是一个地址。
二、指针运算
当一个指针指向一个数组元素时,可以在指针上加一个整数或减一个整数来使它指向同一数组元素。在这样的指针上加1是通过它所引用类型的数据的字节数啦增加它的值,因此,它就指向下一个数组元素。
如:int a[3]={0,1,2}
int* p=a;
那么在p上加1,即可得到数组第二个元素。
#include <iostream>
using namespace std;
void main()
{
int a[3] = { 0,1,2 };
int* p = a;
int* q = p + 1;
cout << "*p== " << *p << endl;
cout << "*q== " << *q << endl;
cout << "p== " << p << endl;
}
对两个指向数组元素的指针进行相减可以得到在两个地址之间数组元素个数。换句话说,如果p和q是指向相同理性的指针,那么语句q=p+n意味着q-p=n。存储两个指针差的便捷方法是把这个差存储在ptrdiff_t中,它在stddef.h中定义,包含在
void swap(int x,int y)
{
int temp = x;
x = y;
y = temp;
}
以上程序的调用对于x和y不会产生任何效果。在推出函数后允许改变函数固定实参值的方式叫做”传递引用“。
#include <iostream>
using namespace std;
void swap(int* x, int* y)
{
int temp = *x;
*x = *y;
*y = temp;
}
void main()
{
int i = 7, j = 8;
swap(&i, &j);
cout << "i== " << i << endl;
cout << "j== " << j << endl;
}
四、指针和一维数组
在C和C++在大多数表达式中把数组名换成指向它第一个元素的指针。
因此,我们可以进行如下操作:
int a[4]={0,1,2,3},*p;
p=a; //只在p中存储了a[0]的地址
除了在声明中或者当一个数组名是sizeof运算符或&运算符的操作数之外,编译器总是把数组名解释成指向它的第一个元素的指针。可以将这个原则表达为:
a==&a[0]
*a==a[0]//以上两者等价。
使用指针运算的规则,那么当把一个整型变量i和一个数组名相加,结果就得到指向数组第i个元素的指针,也就是:
a+i==&a[i]
重要的指针原则:
*(a+i)==a[i]