数组指针、指针数组、函数指针、指针函数 -----笔记

1.数组的四种访问方式

定义数组 a[]; 指针 *p 指向数组a;

(1) 利用数组的下表进行访问 a[i];

(2) 数组名+地址的偏移量i *(a+i)

(3) 利用指针 p 进行下表访问 p[i]

(4) 指针p + 地址的偏移量i *(p+i)

一维数组数组名:相当于一个单指针

2.

数组指针(指针)     指针数组(数组)

函数指针(指针)     指针函数(函数)    -------->只看后边两个字就能够区分是指针还是数组或函数

_____________________________________________________________________________

数组指针:(指向数组全部地址的指针)

int a[3]={2,3,4}

int *p = a;                     // 指向数组的指针

int *p1 = &a[0]                  // 指向数组首元素的指针

int (*p2)[3] = &a;                // 数组指针指向数组的全部地址

3  - >   所指向数组中数据的个数

&a  表示数组从开始到结束全部的地址空间

_____________________________________________________________________________

指针数组:(保存多个地址的数组)

int a=10;

int b=20;

int c=30;

int *pa[3]={&a,&b,&c};           //保存的是 int* (地址)

_____________________________________________________________________________

函数数指针 (指向函数的指针)     //   函数名代表函数的入口地址

三个要素: 与所指函数 返回值类型相同,参数类型相同,参数个数相同。

int Max(int a,int b){ }

int (*pfun)(int,int);

main()

{

Max(12,13);

pfun=&Max;          ---->         pfun=Max;

(*pfun)(12,13);     ---->         pfun(12,13);

}

_____________________________________________________________________________

指针函数 (返回类型为指针类型称为指针函数)

定义格式: 返回类型标识符 *函数名称(形式参数表)

{ 函数体 }

_____________________________________________________________________________

3  如何区分:

数组指针:

定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,

这个一维数组的长度是n。

指针数组:

定义 int *p[n]; []优先级高,先与p结合成为一个数组,再由int*说明这是一个整型

指针数组,它有n个指针类型的 数组元素。

函数指针:

定义 int (*pfun)(int,int); *pfun在括号内,首先形成指针,出括号后仍为括号,

指向一个返回值为整形的函数,并且此函数有 两个整形作为形参。

指针函数:

定义 int *fun(); 相当于 int* fun(); 返回值为一个整形的指针。

_____________________________________________________________________________

4.复杂指针:



右左法则: 从未定义的标识符开始阅读,然后先往右看,再往左看。每次遇到圆括号时,掉转方向。

一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过程直到解析完毕。

int (*fun)(int *p);

首先找到那个未定义的标识符,就是fun,它的外面有一对圆括号,而且左边是一个*号,这说明

fun是一个指针,然后跳出这个圆括号,先看右边,也是一个圆括号,这说明(*func)是一个函数,

而fun是一个指向这类函数的指针,就是一个函数指针,这类函数具有int*类型的形参,返回值类型是 int。

int (*fun[5])(int *p) ;

fun右边是一个[ ],说明fun是一个具有5个元素的数组,fun的左边有一个*,说明fun的元素是指针,

要注意这里的*不是修饰 fun的,而是修饰fun[5]的,原因是[]运算符优先级比*高,fun先跟[]结合,

因此*修饰的是func[5]。跳出这个括号,看右边,也是一对圆括号,说明func数组的元素是函数类型的

指针,它所指向的函数具有int*类型的形参,返回值类型为int。

时间: 2024-07-30 13:44:32

数组指针、指针数组、函数指针、指针函数 -----笔记的相关文章

数组、函数和指针

一.数组和指针 数组名同时也是该数组首元素的地址.例如:flizny == &flizny[0] , flizny 和 &flizny[0]都代表首元素的内存地址,两者都是常量: 指针+1的结果就是对该指针增加一个存储单元,对于数组而言,地址会增加到下一元素的地址,而不是下一个字节. 可以用以下等式表示: dates + 2 == &date[2] // 相同的地址 *(dates + 2) == dates[2] //相同的值 二.函数和指针 由于数组名就是数组首元素的地址,所以

指针 指针与数组 指针与字符串 指针与函数 结构体与指针 宏

指针 指针与数组 指针与字符串 指针与函数?? 指针与数组 1.数组名:数组元素首地址 eg: int array[3]={1,3,6}; 这里array 恒等于&array[0] 2.int *p = a; int *p = 0; int a[]={0}; 3.int *p = a; 均指向数组的首地址 *p是? *(p+1)是?(*p)+1是? *(p+1)决定向下移动几个字节是类型 4.指针可以当数组名使用 p[1] = 3; 恒等于a[1] ;恒等于*(p+1);恒等于*(a+1) 5.

c/c++ 函数、常量、指针和数组的关系梳理

压力才有动力,15年中旬就要准备实习,学习复习学习复习学习复习学习复习……无限循环中,好记性不如烂笔头……从数组开始,为主干. c 的array由一系列的类型相同的元素构成,数组声明包括数组元素个数和类型,c 中的数组参数是引用形式传参(传址调用),而常量标量是按值传递. //[]方括号表示声明的是数组,里面的数字表明了数组包含的元素数目 int states[50];//声明50个整数的数组 double code[365];//声明365个浮点数的数组 char chr[20];//声明20

指向函数的指针数组的用法

声明一个指向函数的指针数组,并通过指针调用函数. #include<stdio.h> void f1();//函数f1的声明 void f2();//函数f2的声明 void f3();//函数f3的声明 void main() { void (*f[3])()={f1,f2,f3};//指向函数的指针数组的声明 int flag; printf("请输入一个1,2或者3.输入0退出.\n"); scanf("%d",&flag); while(

函数指针和指针函数和回调函数以及函数指针数组

1.首先来说,函数指针 就是函数的指针 2.指针函数,就是指针的函数.也就是返回值是个指针 一.指针 [1]指针  1--- 指针变量:用于存放地址量的变量  2--- 地址常量   int a = 20:   int *p = &a: [2]运算符  1--- &  2--- *(指针解引用):通过地址获取其内容  3--- []:只针对于指针运算.指针加单位长度,后取*运算. 二.函数 [1]指针函数 [2]函数指针 [3]函数指针数组  本质:数组,由多个元素组成  元素:函数指针类

四 指针与数组 五 函数

四 指针与数组 <一> 指针  就是地址 1 定义 int *p; 2 初始化 int a,*p=&a; 把a的地址给*p 指针变量有了谁的地址就是指向谁.则*p就代表了这个变量.*p代表 a 3 操作 int a ,*p=&a; *p=5;        <-----把5赋值给了a int *p,a; *p=[*&]a; | 抵消了 *p <=>a 等价 注意 : * 三个用途  1 乘法运算 2 取值运算符 3 说明符 定义时候用到 如 int a

C 函数、指针和数组

C中经常要写一个对数组进行操作的函数,下面介绍一下,数组.指针和函数的应用: 指针和数组: #include <stdio.h> #include <stdlib.h> int sum(int *ar,int n); int main() { int a[10]; int n=5,i; for(i=0;i<n;i++){ scanf("%d",&a[i]); } printf("%d",sum(a,n)); return 0;

2、函数内部属性 arguments是类数组对象,主要用途是保存函数参数,但这个对象中有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数

例如:(1).function factorial(num){ if(num<=1){ return 1; }else{ return num*factorial(num-1); } }//此时是递归算法 var trueFactorial=factorial;//将factorial复制给trueFactorial factorial=function(){ return 0; }//覆盖factorial函数 alert(trueFactorial(5));//0;因为辞职factorial

【ThinkingInC++】18、指向函数的指针数组

/** * 功能:指向函数的指针数组 * 时间:2014年8月14日07:24:46 * 作者:cutter_point */ #include<iostream> #include<cstdlib> using namespace std; //这里N就是函数名,而DF(N)就代表了后面的N函数,N可以变 #define DF(N) void N() {cout<<"function "#N" is called"<<

关于复杂指针数组,函数以及函数指针,数组思考

指针数组其实是数组,只不过是数组里面放着指针如int *p[],由于中括号的优先级高于星号,所以p先与中括号结合形成数组,然后再与星号结合形成指针数组,即每一个数组元素是一个指向整形数据的指针.而数组指针实际上是指向数组的指针如int(*p)[]. 同理函数指针是指向一个函数的指针,指针函数是说这个指针指向了一个函数如int(*fun)(int) ,而函数指针则意味着它是一个函数,这个函数的返回值是一个指针,如int * fun(intx).因此通过这个规律我们可以理解更深层次的更复杂的指针,