##一、指针概述
###1.指针是什么? 简单来说,指针是一个地址,其指向存储某一个数据的存储地址。 一个变量的指针就是这个变量的地址。存放地址的变量,就是指针变量。
###2.定义指针
存储类型名 数据类型 *指针变量名
如
int *p;
p即为指针变量。
把指针变量指向的变量的数据结构称为指针的数据类型,而任何一个指针变量本身数据值的类型都是unsigned long int。
###3.指针的初始化 用地址量初始化指针变量。
##二、指针的运算
###1.取地址与取值运算
- &运算符:为取地址运算符,&x的值为x的地址
- *运算符:指针运算符或指向运算符也称间接运算符
对于指针px:
- px -- 指针变量,它的内容是地址量。
- *px -- 指针的目标变量,它的内容是数据。
- &px -- 指针变量占用的存储区域的地址。
例:
#include<iostream>
using namespace std;
int main()
{
int a = 1;
int *p;
p = &a;
cout << "p =" << "\t" << p << endl;
//p = 0018F800
cout << "*p =" << "\t" << *p << endl;
//*p = 1
cout << "&p =" << "\t" << &p << endl;
//&p = 0018F7F4
system("pause");
return 0;
}
###2.指针的算数运算
#include<iostream>
using namespace std;
int main()
{
double a[5] = {1,2,3,4,5};
double *pa, *pb;
pa = &a[0];
pb = &a[4];
cout << "*pa = " << *pa << endl; //*pa = 1
cout << "*pb = " << *pb << endl; //*pb = 5
//1.指针与整数的加减运算(p+n,p-n)
//指针作为地址量加上或减去一个整数n,其意义是指针当前指向位置的前方或后方地n个
//数据的位置。
//p+n的实际操作是:(p)+n*sizeof(数据类型)
//p-n的实际操作是:(p)-n*sizeof(数据类型)
pa = pa + 2;
cout << "pa+2 = " << *pa << endl; //*pa=3
//2.指针加1、减1运算(p++,++p,p--,--p)
//指针++运算后指向下一个数据的位置,指针--运算后指向上一个数据位置。
pa++;
cout << "pa++ = " << *pa << endl; //*pa=4
//3.指针的相减运算(px-py)
//如果两指针px,py所指向的变量类型相同,则可对它们进行相减运算,px-py运算的结果
//值是两指针指向的地址位置之间的数据个数。
int c = pb - pa;
cout << "pb - pa = " << c << endl; //c=1
system("pause");
return 0;
}
###3.指针的关系运算
#include<iostream>
using namespace std;
int main()
{
int a[5] = { 1,2,3,4,5 };
int *pa, *pb;
pa = &a[0];
pb = &a[4];
//若数据在内存中的存储逻辑是由前向后,则指向后方的指针大于指向前方的指针。
cout << "pa > pb is " << (pa > pb) << endl; //0
cout << "pa < pb is " << (pa < pb) << endl; //1
system("pause");
return 0;
}
根据指针与0的比较,可以用于判断指针p是否为空指针。
###4.void指针和const指针 4.1 void指针 不同类型的指针之间,除非进行强制类型转换,否则不能相互赋值。 void指针是一个特例,C++中的void指针,不指定指针指向一个固定的类型:
void *p
它表示指针变量p不指向一个确定的类型数据,它的作用仅仅是存放一个指针。任何指针可以给void指针赋值,要将void指针赋值给其他类型的指针,则要进行强制类型转换。
4.2 const指针
- 声明指向常量的指针:关键字const放在指针类型前。程序不能通过指针来改变它所指向的值,但是指针本身的值可以改变,即指针可以指向其他数据。
- 声明指针常量:关键字const放在“*”号和指针名之间。指针本身的值不可以改变,即它不能指向其他数据,但它所指向的数据的值可以改变。
- 声明指向常量的指针常量:在指针类型前、“*”和指针名之间都加关键字const。指针本身的值不可以改变,它所指向的数据的值也不能通过指针改变。
#include<iostream>
using namespace std;
int main()
{
int a(1);
int *p1(&a);
void *p2(p1);
int *p3((int *)p2);
cout << "*p3= " << *p3 << endl;
//声明指向常量的指针
const int *p4(&a);
//声明指针常量
int * const p5(&a);
//声明指向常量的指针常量
const int * const p6(&a);
cout << "*p4 = " << *p4 << endl;
cout << "*p5 = " << *p5 << endl;
cout << "*p6 = " << *p6 << endl;
system("pause");
return 0;
}
##三、指针与数组
定义一个指向数组的指针:
int a[10];
int *p = a;
或
int a[10];
int *p = &a[0];
###1.访问数组元素的方法
- 下标法
- 地址法 一个数组名代表它的起始位置,如
int a[5]
a的值就是数组的起始地址,即a指向a[0],a+1指向a[1]...则*(a+i)=a[i].
- 指针法
int a[5];
int *pa = a;
则*(pa + i)=a[i]
###2.数组指针与指针数组 2.1数组指针
//定义一个数组指针,指向一个包含5个元素的一维数组
int (*p)[5];
2.2指针数组
char *name[5] = {"Tom","John","Mary"};
name是一维数组,每一个元素都是指向字符数据的指针类型数据,name[0]指向第一个字符串"Tom",name[1]指向第二个字符串"John"
##四、指针与函数
###1.指针作为函数参数 函数调用为传址调用,也就是使实参指针和形参指针变量指向同一内存地址。 例:
#include<iostream>
using namespace std;
void swap(int *,int *);
int main()
{
int a = 3, b = 4;
cout << "a = " << a << " b = " << b << endl; //a=3,b=4
swap(a, b);
cout << "a = " << a << " b = " << b << endl; //a=4,b=3
system("pause");
return 0;
}
void swap(int *x, int *y)
{
int t = *x;
*x = *y;
*y = t;
}
###2.指针型函数 除了void函数外,函数在调用结束后都会有返回值指针也可以作为函数的返回值。当一个函数的返回值是指针类型时,这个函数就是指针型函数。
int *fun(int a,int b);
//返回一个指向整型数据的指针
例:
#include<iostream>
#include<string>
using namespace std;
char *max(char *a, char *b)
{
return (strcmp(a, b) ? a : b);
}
int main()
{
char *p;
p = max("hello", "good");
cout << p << endl; //输出 hello
cout << *p << endl; //输出 h
system("pause");
return 0;
}
###3.函数指针 函数指针就是指向函数的指针,定义:
数据类型 (*函数指针名) (参数表)
例:
/**
*函数指针:即为指向函数的指针
*一般格式为:数据类型 (*函数指针名) (参数表)
*/
#include<iostream>
using namespace std;
int max(int x, int y)
{
return (x > y ? x : y);
}
int main()
{
int(*p)(int, int); //定义函数指针
int a, b, c;
p = max; //初始化函数指针
cout << "Pleasee input 2 numbers: " << endl;
cin >> a >> b;
c = (*p)(a, b); //通过函数指针调用函数
cout << "max(a, b): " << c << endl;
system("pause");
return 0;
}
来源:oschina
链接:https://my.oschina.net/u/2368202/blog/760335