指针学习笔记
指针是一个特殊的变量,它里面存储的数值被解释成内存里的一个地址
从下方面四个方面入手(索要资料:974488891):
1. 指针的类型
2. 指针所指向的类型
3. 指针的值的值或者叫指针所指向的内存区
4. 指针本身所占据的内存区
Example:
int *ptr;
char *ptr;
int **ptr;
int (*ptr)[3];
int *(*ptr)[4]
一.指针类型
int *ptr; //其类型是int *;
char *ptr; //指针类型char *
int **ptr; //指针类型int **,二级指针
int(*ptr)[3]; //指针类型时int (*)[3]
int*(*ptr)[4]; //指针类型int *(*)[4]
二.指针所指向的类型
当我们通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将吧计算器那块区域里的内容当做什么来看待,从语法上来看,只需把指针声明语句中的指针名字和名字左边的指针声明符号*去掉,剩下的就是指针所指向的类型.
int *ptr; //指针所指向的类型为int
char *ptr; //指向的类型为char
int **ptr; //指针指向的类型时int*,二级指针
int (*ptr)[3]; //指针指向的类型是int ()[3]
int *(*ptr)[4]; //指针指向的类型是int *()[4]
1.指针类型剖析:
int p; //普通的整型变量
int *p; //普通的整形指针变量
int p[3]; //普通的p先结合数组再结合int型,整形数据类型数组
int *p[3]; //p先结合[],优先级[]高于*,所以p是一个数组,再与*结合,所以数组里面的数据类型是指针类型,返回整型数据的指针所组成的数组
int (*)p[5]; //从变量名开始先结合*,再结合[],故指针所指向的内容是一个数组,然后和int 结合,数组里面元素是整形的,所以p是一个指 向整形数据 组 成的数组的指针
int **p; //指针指向的元素是指针,二级指针
int p(int); //p是一个函数
int (*p)(int); //首先p是一个指针,再与(int)结合,所以P是一个指向有一个整形参数且返回类型为整形的函数的指针
int *(*p(int))[5]; //从p开始,线与()结合,所以p是一个函数,(*p(int))函数返回的是一个指针,再结合[5],说明返回的指针是指向的一个数组,再与*结合,数组元素是指针;
2.指针类型转换
当初始化一个指针或指针赋值时候,赋值号左右两边类型不一致的情况下,此时需要进行强制类型转化
语法:(TYPE*)P;
三.指针数组和数组指针
指针数组:用于存储指针的数组,也就是数组元素都是指针。
数组指针:指向数组的指针。
int *a[10]; //指针数组,首先a是一个数组,包含10个元素,每个元素都是指针,表示数组a中的元素都为int型指针。
元素表示:*a[i] *(a[i])是一样的,注意优先级的问题
int (*a)[10]; //数组指针,表示指向数组a的指针,但是其元素表示(*a)[i],在实际应用对于指针数组,都会经常这样使用。
Typedef int * pInt; //自定义数据类型,
pInt a[10];
四.函数指针和指针函数
函数指针:首先是一个指针,只是这个指针指向的是一个函数
指针变量可以指向变量的地址、数组、字符串、动态分配地址,同时也可以指向一个函数,每个函数在编译的时候,系统会分配给该函数一个入口地址,函数名表示这个入口,那么指向指针变量称为函数指针变量
声明格式:
类型说明符 (*函数名)(参数),准确的说这里不能叫函数名,应该叫做指针变量
Void (*fptr)();
赋值:fptr = &function;取地址运算符不是必须的,因为函数名就表示地址
fptr = function;
如果是函数调用,就必须包括()
两种方式通过指针调用函数
X =(*fptr)();
X = fptr();
指针函数:首先是一个函数,只不过这个函数的返回值是一个地址的值,但函数返回值必须使用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且在主调函数中,函数返回值必须给同类型的指针变量。
声明格式: *函数名(参数)
Float *fun();
Float *p;
P = fun(a);
// PSProject.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
void (*funcp)();//函数指针
void FileFunc(),EditFunc();
int *GetData(int week,int day);
int _tmain(int argc, _TCHAR* argv[])
{
int arr[4] = {10,20,30,40};
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<<"result1 = "<<*a[1]<<endl;
cout <<"result2 = "<<(*b)[2]<<endl;
//区分函数指针和指针函数
cout <<"函数指针"<<endl;
funcp = FileFunc;//只是把函数地址赋给func这个指针
(*funcp)(); //这样才能输出
funcp = EditFunc;
(*funcp)(); //这样才能输出
//指针函数
int wk,dy;
do
{
printf("请输入周(1-5)天(1-7):\n");
scanf("%d,%d",&wk,&dy);
} while (wk < 1 ||wk > 5|| dy <1 || dy >7);
printf("%d\n",*GetData(wk,dy));
system("pause");
return 0;
}
void FileFunc()
{
printf("FileFunc\n");
}
void EditFunc()
{
printf("EditFunc\n");
}
int *GetData(int week,int day)
{
static int calendar[5][7]=
{
{1,2,3,4,5,6,7},
{8,9,10,11,12,13,14},
{15,16,17,18,19,20,21},
{22,23,24,25,26,27,28},
{29,30,31,-1}
};
return &calendar[week-1][day-1];
}