指针的简单理解

心已入冬 提交于 2020-04-14 03:24:38

【今日推荐】:为什么一到面试就懵逼!>>>

##一、指针概述

###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;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!