指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。
学习好指针必须要从四个方面入手:
1、指针的类型
2、指针所指向的类型
3、指针的值或者叫指针所指向的内存区
4、还有指针本身所占据的内存区
例如1:
a. int *ptr;
b. char *ptr;
c. int **ptr;
d. int (*ptr)[3];
e. int *(*ptr)[4];
一、指针类型
int *ptr; // 指针类型是int*
char *ptr; // 指针类型是char*
int **ptr; // 指针类型是int**
int (*ptr)[3]; // 指针类型是int(*)[3]
int *(*ptr)[4]; // 指针类型是int*(*)[4]
二、指针所指向的类型
当我们通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把计算机那块内存区域里的内容当做什么来看待。从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针的声明符*去掉,剩下的就是指针所指向的类型。
f. int *ptr; // 指针所指向的类型是int
g. char *ptr; // 指针所指向的类型是char
h. int **ptr; // 指针所指向的类型是int *
i. int (*ptr)[3]; // 指针所指向的类型是int()[3]
j. int *(*ptr)[4]; // 指针所指向的类型是int*()[4]
送给大家一句:重要在于实战、多手动编写代码,这才是学好C语言的关键,多多参加项目企业实战技术。
1、指针类型剖析
int p; // 普通的整型变量
int *p; // 普通的整型指针变量
int p[3]; // 整型数据类型的数组
int *p[3]; // 说明数组里面元素是指针类型,返回整型数据的指针所组成的数组
int (*)p[5]; // 说明指针所指向类型是一个数组,然后再与int结合,说明数组里面的元素是整型的,所以p是一个指向整型数据组成的数组的指针。
int **p; // 说明指针所指向的元素是指针
int p(int); // p是函数,该函数有一个参数为整型,说明函数返回值int。说明p是一个有整型参数且返回类型是int的函数
int (*p)(int); // p是一个指向有一个整型参数且返回类型为整型的函数的指针。
int *(*p(int))[5]; // 首先要从p开始,先与()结合,然后进入()里面,与int结合,说明函数有一个整型变量参数;然后再与外面的*结合,说明函数返回的是一个指针;然后到最外面一层,先与[]结合,说明返回的指针指向的是一个数组;然后再与*结合,说明数组的元素是指针;然后再和int结合,说明指针指向的内容是整型数据,所以p是一个参数为一个整型且返回一个指向由整型指针变量组成的数组的指针变量的函数。
2、指针类型转换
当我们初始化一个指针或指针赋值时候,赋值号左右两边类型不一致的情况下,此时需要进行强制转换。
语法:(TYPE*)p;
三、指针数组和数组指针 加小编的群466572167,可以交流学习,群内也有资料下载学习
指针数组:用于存储指针的数组,也就是数组元素都是指针。
数组指针:指向数组的指针。
例如:
int *a[10]; // 指针数组
表示:数组a中的元素都为int型指针,元素表示:*a[i] *(a[i])是一样,因为[]优先级别高于*。
int (*a)[10]; // 数组指针
表示:指向数组a的指针 ,元素表示:(*a)[i]。在实际应用中,对于指针数据,我们大家都会经常这样使用。
typedef int* pInt;
pInt a[10];
代码实现:
// PSProject.cpp : 定义控制台应用程序的入口点。
//
#include"stdafx.h"
#include<iostream>
usingnamespace std;
int_tmain(intargc, _TCHAR* argv[])
{
int Arr[4] = { 10, 20, 30, 40 }; // Arr[0] Arr[1] Arr[2] Arr[3]
int *a[4]; // 指针数组 有四个指针:a[0] a[1] a[2] a[3]
int (*b)[4]; // 数组指针 指针(这个指针可以指向数组)
b = &Arr; // 将Arr数据地址赋给b的这个数组指针
for (int i = 0; i < 4;i++)
{
a[i] = &Arr[i];
}
cout << "Result="<<*a[1] << endl;
cout << "Result=" << (*b)[2] << endl;
return 0;
}
运行效果:
四、函数指针与指针函数
函数指针:首先它是一个指针,只是这个指针指向的是一函数。指针变量可以指向变量的地址、数组、字符串、动态分配地址,同时也可以指向一个函数,每个函数在编译的时候,系统会分配给该函数一个入口地址,函数名表示这个入口,那么指向指针变量称为函数指针变量。
声明格式如下:
类型说明符 (*函数名)(参数)
例如:
void (*fptr)();
赋值:
fptr=&function;
fptr=function;
如果函数调用,还必须包括圆括号的参数表。
两种方式来通过指针调用函数:
x=(*fptr)();
x=fptr();
指针函数:首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须使用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须给同类型的指针变量。