关于理解数组与指针

指针指向数组问题

int arr1[10];
char arr2[10];
char *parr[10];//指针数组
int(*parr1)[10]=&arr1;
int *p=arr1;
char *(*pparr[3])[10];//指向数组的指针数组

指向函数的指针

void fun1(char *str)
{
printf("%s\n",str);
}
void fun2(char *str)
{
printf("%s\n",str);
}
void fun3(char *str)
{
printf("%s\n",str);
}
//函数类型均相同(返回值相同,参数类型相同),这些函数可以放到指针数组里
int main()
{
void(*pfun1)(char *p)=fun1;//fun1赋给*pfun1这个指针
void(*pfun2)(char *p)=fun2;//fun2赋给*pfun2这个指针
void(*pfun3)(char *p)=fun3;//fun3赋给*pfun3这个指针

pfun1("fun1");//调用fun1函数
pfun1("fun2");//调用fun2函数
pfun1("fun3");//调用fun3函数
return 0;
}

由于这些函数类型都相同,main函数也可这样写

int main()
{
void(*pfun)(char *p)=fun1;//pfun不断变化调用其他函数
pfun=fun1;
pfun("fun1");

pfun=fin2;
pfun("fun2");

pfun=fun3;
pfun("fun3");

return 0;
}

由于这些fun函数类型均相同(返回值类型和函数类型),也可用指针数组改写

int main()
{
void(*pfun[4](char *p)=fun1);//存放4个元素的指针数组
void(*pfunarr[4])(char*p);//pfunarr首先是一个数组,函数指针的数组

}

指向数组的指针

int fun(char*a,int*b)
{
return 0;
}
#include<stdio.h>
{
int (*p)(char*,int*);//函数指针
    int (*pfun[10])(char*,int*);存放函数指针的数组
    int(*(*q)[10])(char*,int*);//能够指向函数指针的数组的指针
    //int (*(*pfun)[10])(char*,int*);//pfun指向数组,(*pfun)[10]指向函数,函数类型是
                                      //char*,int*  指向函数指针数组的指针  
     q=&pfun;//指向函数指针的数组的指针,数组的每个元素也是一个指针
    //int(*w)[10];//指向整形数组的指针
    return 0;
}

相对较复杂的指针

(*(void(*)())0)();

为函数调用,调用0作为函数地址,强制转化为指针

void(*signal(int,void(*)(int)))(int);

函数声明,函数返回值为void,参数类型为int,里面的signal指针,第一个参数为int,第二个为一个函数,返回值void,参数类型int

但是,这样写函数过于麻烦,一般用typedef来改写

int arr[10];
typedef int(*parrPtr)[10];

当不加typedef时parrPtr为数组指针变量名,重命名后为这个类型的名

parrPtr p1 = &arr;

void fun(char*c, int *i)
{
}
//类型重命名
typedef void(*pfunPtr)(char*, int*);
//调用时
pfunPtr p4 = fun;
typedef void(*pfunptr2)(int);
void(*signal(int, void(*)(int)))(int);

故void(*signal(int,void(*)(int)))(int);可相应改写为

pfunptr2 signal(int,pfunptr2);
//指向这个函数的指针
pfunptr2(*pfun)(int, pfunptr2) = signal;
时间: 2024-12-20 18:29:36

关于理解数组与指针的相关文章

深入理解数组与指针的区别

在大一刚开始学习C的我们也许并没有真正的理解数组与指针,其实C的精华部分便是指针与内存的分配这一块. 那是充其量我们能够知道数组与指针肯定不是完全等价的,相同点就是:对数组的引用总是转化为对指针的引用,而不同点呢就是数组名是常量而指针是变量仅此而已,随着我们资历不断的提升,我们么更加进一步的去理解它,从他的本质去即内存的分配与访问去理解它. 好了,首先呢我们必须明白一个概念在C语言中,一个变量的声明和定义有什么区别. 我们知道定义只是一个特殊的声明. 定义:只能出现在一个地方,创建新对象,同时确

深入理解数组与指针——原因在于”退化“

(一) 数组与指针本质是不同的.如下图所示 char a[]="hello"; char *p="hello"; 上述代码的初始化结果如下图所示: a就是一个数组变量,表示整个数组.p是一个指针变量,存储的值是地址. 数组变量a和指针变量p,都存储在用户栈中. 而表达式char *p=”hello“中的”hello“是字面量,存储在静态只读存储区 .rodata区域.p存储的是”hello“的首元素地址 由此,可以看出数组和指针的区别有多大!!! (二) 但有时候”

(C/C++)区别:数组与指针,指针与引用

1.数组跟指针的区别 数组要么在静态存储区被创建(如全局数组),要么在栈上被创建.数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变. 指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存.指针远比数组灵活,但也更危险. 数组和指针特点的简单比较: 数组 指针 保存数据 保存地址 直接访问数据 间接访问数据,先取得指针的内容,然后以它为地址取得数据 用于存储数目固定且类型相同的数据 通常用于动态数据结构 编译器自动分配和删除

C语言核心之数组和指针详解

寒假要开始猛刷<剑指offer>,先回顾一下C语言基础做个热身. 指针 相信大家对下面的代码不陌生: 1 int i=2; 2 int *p; 3 p=&i; 这是最简单的指针应用,也是最基本的用法.再来熟悉一下什么是指针:首先指针是一个变量,它保存的并不是平常的数据,而是变量的地址.如上代码,指针p中保存的是整型变量i的地址信息. 接下来看如何定义一个指针,既然指针也是一个变量,那么它的定义也和其它变量一样定义:如: int *p: .'*' 是间接寻址或间接引用运算符.上例中我们还

c++ 数组 与指针

指针 相信大家对下面的代码不陌生: int i=2;                                             int *p;                                              p=&i; 这是最简单的指针应用,也是最基本的用法.再来熟悉一下什么是指针:首先指针是一个变量,它保存的并不是平常的数据,而是变量的地址.如上代码,指针p中保存的是整型变量i的地址信息. 接下来看如何定义一个指针,既然指针也是一个变量,那么它的定义也和

程序猿之--C语言细节13(二维数组和指针,&amp;*a[i][0]的理解,数组1[e]和e[1]很可能你没见过)

主要内容:二维数组和指针,&*a[i][0]的理解.数组1[e]和e[1] #include <stdio.h> #define NUM_ROWS 10 #define NUM_COLS 10 int main(int argc, char **argv) {     int a[NUM_ROWS][NUM_COLS], *p, i = 0; // a理解为指向整数指针的指针 即int **     int c, d=2,*test, e[2] = {4,5},f[2][2] = {{

直观理解C语言中指向一位数组与二维数组的指针

一维数组和指针: 对于一位数组和指针是很好理解的: 一维数组名: 对于这样的一维数组:int a[5];  a作为数组名就是我们数组的首地址, a是一个地址常量 . 首先说说常量和变量的关系, 对于变量来说, 用箱子去比喻再好不过了, 声明一个变量就声明一个箱子,比如我们开辟出一个苹果类型的箱子, 给这个变量赋值就是把盛放苹果的箱子中放入一个实实在在的苹果, 这就是变量的赋值.  而对于数组来说, 就是一组类型相同的箱子中,一组苹果箱子, 可以放入不同的苹果. 一维数组空间: 变量被声明后, 我

深刻理解C语言:数组和指针

参考<C专家编程>的下列章节: 第4章 令人震惊的事实:数组和指针并不相同 第9章 再论数组 第10章 再论指针 数组名的理解: int a[10]; 1. a代表指向第一个数组元素的指针.做函数形参时,在表达式中时. 2. a看成一个整体.a的数据类型是int[10].因此a取地址后加一的步长为40 视频参考: 指针及指针操作 数组 高级指针.C.面向对象

程序员之--C语言细节13(二维数组和指针,&amp;amp;*a[i][0]的理解,数组1[e]和e[1]非常可能你没见过)

主要内容:二维数组和指针.&*a[i][0]的理解.数组1[e]和e[1] #include <stdio.h> #define NUM_ROWS 10 #define NUM_COLS 10 int main(int argc, char **argv) {     int a[NUM_ROWS][NUM_COLS], *p, i = 0; // a理解为指向整数指针的指针 即int **     int c, d=2,*test, e[2] = {4,5},f[2][2] = {{