##1、指针概述ios
###1.指针是什么? 简单来讲,指针是一个地址,其指向存储某一个数据的存储地址。 一个变量的指针就是这个变量的地址。存放地址的变量,就是指针变量。数组
###2.定义指针数据结构
存储类型名 数据类型 *指针变量名
如函数
int *p;
p即为指针变量。spa
把指针变量指向的变量的数据结构称为指针的数据类型,而任何一个指针变量自己数据值的类型都是unsigned long int。指针
###3.指针的初始化 用地址量初始化指针变量。code
##2、指针的运算内存
###1.取地址与取值运算ci
对于指针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运算(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指针
#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; }
##3、指针与数组
定义一个指向数组的指针:
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"
##4、指针与函数
###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; }