精华内容
下载资源
问答
  • 数组指针和指针数组,从字面上区分的方法就是:本质看最后两个字。例如数组指针的本质就是一个指针,一个指向数组的指针;而指针数组的本质就是一个数组,一个成员都是指针的数组。 1.数组指针 1.1 基本概念 数组...


    数组指针和指针数组,从字面上区分的方法就是:本质看最后两个字。例如数组指针的本质就是一个指针,一个指向数组的指针;而指针数组的本质就是一个数组,一个成员都是指针的数组。

    1.数组指针

    1.1 基本概念

    数组指针,即指向一个数组的指针。可以指向一维数组,也可以指向二维数组(三维及以上数组一般不用)。

    1.2 定义格式

    int (*p)[n]=NULL;
    
    p = 数组名;   //当数组是一维数组时,直接写数组名编译器会警告,但是运行正常。写成“&数组名”不会警告。对于二维及以上数组,直接写数组名不会警告。
    

    解析:

    类型说明符 (*指针变量名)[长度]。

    其中“类型说明符”为所指数组的数据类型。* 表示其后的变量p是指针类型,它指向的对象是一个整体,即一维数组(不能拆开此数组)。

    【注1】

    首先 运算符[ ] 的优先级比 * 高,虽然在优先级表中 [ ] 的优先级最高,其次是 ( ) 。但是 ( ) 有强制结合的功能,所以这里p是和*结合的,而不是[]。

    【注2】

    当数值指针指向一维数组时,n是一维数组元素的个数。
    当数值指针指向二维数组时,n是二维数组的列数,即按行拆分成一维数组后,一维数组的个数。

    【注3】

    数组指针也叫“行指针”,原因是数组指针指向的数组不管是一维数组,还是二维数组,指针变量p指向的都是行。

    【例】用“数组指针”分别指向并遍历一维数组和二维数组的所有元素。

    #include <stdio.h>
    
    int main(void){
    	int i,j;
    	
    	int a[5]={1,2,3,4,5};
    	int b[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
    	
    	int (*p1)[5]=NULL;
    	int (*p2)[4]=NULL;
    	
    	p1=a; //会警告提示指针类型不匹配,但是可以运行正常,应该是C隐式进行类型转换。写成 p1=&a;无警告无错误 
    	p2=b;
    	
    	printf("遍历输出一维数组元素\n");
    	//通过数组指针来遍历输出一维数组a的元素 
    	for(i=0;i<5;i++){
    		printf("%2d", *((*p1+0)+i) );
    	}
    	
    	printf("\n");
    	
    	printf("遍历输出二维数组元素\n");
    	for(i=0;i<3;i++){
    		for(j=0;j<4;j++){
    			printf("%3d", *(*(p2+i)+j) );
    		}
    		printf("\n");
    	}
    	
    	return 0;
    }
    

    运行结果:
    在这里插入图片描述

    1.3 扩展:指向二维数组的数组指针如何遍历二维数组元素?

    在上例中,数组指针p2指向二维数组b。

    下面探索一下如何使用数组指针 p2 来访问二维数组b中的每个元素。

    1. 数组指针p2指向二维数组 b 的开头,也即第 0 行;p2+1前进一行,指向第 1 行。

    2. *(p2+1)表示取地址上的数据,也就是整个第 1 行数据。注意是一行数据,是多个数据,不是第1 行中的第0个元素。

    3. *(p2+1)+1表示第 1 行第 1 个元素的地址。怎么理解?

      *(p2+1)单独使用时表示的是第1行整体数据,放在表达式中会被转换为第 1 行数据的首地址,也就是第 1 行第 0 个元素的地址,因为使用整行数据没有实际的含义,编译器遇到这种情况都会转换为指向该行第 0 个元素的指针;就像一维数组的名字,在定义时或者和 sizeof、& 一起使用时才表示整个数组,出现在表达式中就会被转换为指向数组第 0 个元素的指针。

    4. *(*(p2+1)+1)表示第 1 行第 1 个元素的值。很明显,增加一个 * 表示取地址上的数据。

    2.指针数组

    2.1 基本概念

    具有指针类型元素的数组称为指针数组,实质上就是一个数组。

    2.2 定义格式

    类型说明符 *指针变量名[长度];

    【注】

    如:int *p[n]; //int *(p[n])也是一个指针数组,这里小括号可有可无。
    []优先级比 * 高,所以先与p结合成为一个数组,然后int *说明该数组中每个元素的数据类型都是“整形指针类型”。

    展开全文
  • 小结 (1)数组的类型由元素类型和数组大小共同决定 (2)数组指针是一个指针,指向对应类型的数组 (3)指针数组是一个数组,其中每个元素都为指针 (4)数组指针遵循指针运算法则 (5)指针数组拥有C语言数组的...

    1.数组类型

    C语言中的数组有自己特定的类型,由元素类型数组大小共同决定。

    如:int array[5]的类型为int[5]
    这个类型说明array数组有五个元素,每个元素都是int类型。

    想想下面的对话对吗?
    A∶这里定义的数组什么类型的?
    B : int 型。

    2.定义数组类型

    C语言中,通过typedef为数组类型重命名。
    格式为:typedef type(name)[size];


    数组类型:
    typedef int(AINT5)[5];
    typedef float(AFLOAT10)[10];
    数组定义:
    AINT5 iarray;
    AFLOAT10 farray;

    有了数组类型之后我们就能够定义数组指针,就像我们有了int类型,可以定义int类型的指针,有float类型,可以定义float类型的指针,有结构体类型可以定义结构体类型的指针,现在我们有了数组类型,那么可以定义数组类型的指针,简称数组指针。
    即:数组指针就是一个指针

    3.数组指针

    数组指针用于指向一个数组,数组名是数组首元素的起始地址,但并不是数组的起始地址,通过将取地址符&作用于数组名可以得到数组的起始地址,可通过数组类型定义数组指针: ArrayType* pointer;也可以直接定义:type(*pointer_name)[n];
    其中,pointer_name为数组指针变量名,type为指向的数组的类型,n为指向的数组的大小。

    小tips:指针运算 p + n ;等价于(unsigned int )p + n*sizeof(*p)

    示例代码

    #include <stdio.h>
    
    //重命名数组类型
    typedef int(AINT5)[5];
    typedef float(AFLOAT10)[10];
    typedef char(ACHAR9)[9];
    
    int main()
    {
        AINT5 a1;
        float fArray[10];//定义一个数组
        AFLOAT10* pf = &fArray;//定义一个数组指针指向上面定义的数组
        ACHAR9 cArray;
    
        char(*pc)[9] = &cArray;//这个也是数组指针
        char(*pcw)[4] = cArray;//数组名代表数组首元素的地址,类型为char*,类型不同,错误
        
        int i = 0;
        
        printf("%d, %d\n", sizeof(AINT5), sizeof(a1));//20 20
         
        for(i=0; i<10; i++)
        {
            (*pf)[i] = i;//pf是一个指针,通过*这个钥匙来访问数组成员
    					//等价于 fArray[i]=i;,打印0-9
        }
        
        for(i=0; i<10; i++)
        {
            printf("%f\n", fArray[i]);
        }
        
        printf("%p, %p, %p\n", &cArray, pc+1, pcw+1);
    	//指针运算 pc+1 ==> (unsigned int)pc +sizeof(*pc) 即加9
    	//pcw+1 ==> (unsigned int)pcw+ sizeof(*pcw) 即加4
        return 0;
    }
    
    
    

    运行结果如下:
    在这里插入图片描述

    4.指针数组

    指针数组是一个普通的数组,指针数组中每个元素为一个指针,指针数组的定义: type* pArray[n];,type* 为数组中每个元素的类型,pArray为数组名,n为数组大小。如下

    在这里插入图片描述

    指针数组的应用,不要因为程序看上去长而感到害怕,开发需要先读懂,代码阅读能力。

    #include <stdio.h>
    #include <string.h>
    
    //得到数组的大小
    #define DIM(a) (sizeof(a)/sizeof(*a))
    
    //查找关键字,遍历table数组
    //char* key,指向一个字符串
    //char* table[] 指针数组
    //size 数组的大小
    int lookup_keyword(const char* key, const char* table[], const int size)
    {
        int ret = -1;
        
        int i = 0;
        
        for(i=0; i<size; i++)
        {
            if( strcmp(key, table[i]) == 0 )
            {
                ret = i;//把所在下标值打印出来
                break;
            }
        }
        
        return ret;
    }
    
    int main()
    {
        const char* keyword[] = {
                "do",
                "for",
                "if",
                "register",
                "return",
                "switch",
                "while",
                "case",
                "static"
        };
        
        printf("%d\n", lookup_keyword("return", keyword, DIM(keyword)));
        printf("%d\n", lookup_keyword("main", keyword, DIM(keyword)));
    
        return 0;
    }
    
    
    

    编译运行结果:
    在这里插入图片描述

    5.小结

    (1)数组的类型由元素类型数组大小共同决定
    (2)数组指针是一个指针,指向对应类型的数组
    (3)指针数组是一个数组,其中每个元素都为指针
    (4)数组指针遵循指针运算法则
    (5)指针数组拥有C语言数组的各种特性
    (6)数组指针,是这种类型 : (*p)[5];
    有括号结合性高,(*p)为指针,所以 ( *p)[5]为数组指针。
    指针数组,是这种类型 * p[5];

    展开全文
  • c语言中,一般函数都是占用一段连续的内存区,而函数名就是这段连续内存区的首地址,而且指针也代表着地址。所以,我们可以吧函数名(函数首)赋值给指针变量,用指针来调用这个函数。 格式:int (*p)() :表示...

    函数指针:
    在c语言中,一般函数都是占用一段连续的内存区,而函数名就是这段连续内存区的首地址,而且指针也代表着地址。所以,我们可以吧函数名(函数首)赋值给指针变量,用指针来调用这个函数。
    格式:int (*p)() :表示指针p指向一个无形参,且返回值是int型的函数。
    p(); :调用时的格式。

    注:int (*p)() 中( *p ) 的括号必须要加,不然像int *p() , 会被认为定义一个函数。****而int (*p)()则是定义一个指针变量指向函数,这就是两者的区别。(右左法则)。
    在这里插入图片描述
    在这里插入图片描述

    关于函数指针的更多应用:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    重要知识点:
    在这里插入图片描述
    右左法则:先找到变量,然后遵循右左的规则,一步步来。
    1> 变量fp右边是括号,然后看左边,是*号,所以是定义了一个指针fp,然后再看右边,是(int),所以就是指向一个函数,并且函数的传递类型形参是int型,看左边是 * 表示函数返回值指针类型。[10]表示是十个元素的数组,加上int * 就表示整型指针数组。
    连起来就是,fp是个指针,然后指向形参为int类型,返回值为指针的函数,而返回的函数又指向十个元素的整型指针数组。

    2> 定义了五个元素的指针数组。数组存的指针指向无参,返回指针的函数,返回的指针又指向无参,返回是整型指针的函数。

    数组指针和指针数组:
    说白了,数组指针就是一个指针指向一个一维数组,而指针数组就是一个数组,数组里边存储的是指针。
    我们以二维数组举列说明:

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    以a[2][3]和b[5]一个二维数组a和一维数组b为列。
    一级指针: b 、 a[0] 、*a 、 *(a+1) 、&b[0]
    二级指针:a 、 &b、&a[0]
    三级指针:&a

    指向指针的指针:
    int *p :p指向int * 类型。
    int **p : 表示这个指针指向的是int *类型的。

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    图二的过程是错误的,图一才是正确的解法。
    原因:图二定义了一个指针p,p中指向的地址是无效地址(野地址),然后它把无效地址转给了s,然后s申请内存,但是action函数运行结束,p指向的地址依旧没有改变,还是无效地址。但是图二就不一样。它传给s的是指针p的地址,而不是该指针p指向的地址,所以*s代表的是p指向的地址,malloc申请的空间的首地址代替了p原本指向的地址,所以有效。

    内存:画图解释。
    在这里插入图片描述
    头文件:include如果是<>表示系统会到系统指定目录查找。如果是“”则表示先到当前目录查找,如果没有会到用户指目录查找,最后会到系统指定目录查找。

    宏定义:定义变量和函数,为宏变量,无参宏函数和有参宏函数。
    宏函数和普通函数的区别:优缺相反
    宏函数优点:执行效率高,节省空间。
    普通函数:编译效率高,有类型检查更安全。
    在这里插入图片描述
    在这里插入图片描述
    上面是宏定义的一些用法,算数的那道是将sor(a+b)直接转成a+b*a+b,如果要修改,则将#define sor(x)(x) * (x) 就是在x周围加上();

    展开全文
  • 指针数组C语言中很重要的两个概念,它们之间有着密切的关系,利用这种关系,可以增强处理数组的灵活性,加快运行速度,本文着重讨论指针数组之间的联系及在编程中的应用。  1.指针数组的关系  当一个指针...

    /来源网络,仅限个人学习记录适用/

    指针与数组是C语言中很重要的两个概念,它们之间有着密切的关系,利用这种关系,可以增强处理数组的灵活性,加快运行速度,本文着重讨论指针与数组之间的联系及在编程中的应用。
      1.指针与数组的关系
      当一个指针变量被初始化成数组名时,就说该指针变量指向了数组。
    如:
      char str[20], *ptr;
      ptr=str;
      ptr被置为数组str的第一个元素的地址,因为数组名就是该数组的首地址,也是数组第一个元素的地址。此时可以认为指针ptr就是数组str(反之不成立),这样原来对数组的处理都可以用指针来实现。
    如对数组元素的访问,既可以用下标变量访问,也可以用指针访问。
      2.指向数组元素的指针
      若有如下定义:
      int a[10], *pa;
      pa=a;
      则p=&a[0]是将数组第1个元素的地址赋给了指针变量p。
      实际上,C语言中数组名就是数组的首地址,所以第一个元素的地址可以用两种方法获得:p=&a[0]或p=a。

    这两种方法在形式上相像,其区别在于:pa是指针变量,a是数组名。值得注意的是:pa是一个可以变化的指针变量,而a是一个常数。因为数组一经被说明,数组的地址也就是固定的,因此a是不能变化的,不允许使用a++、++a或语句a+=10,而pa++、++pa、pa+=10则是正确的。
    由此可见,此时指针与数组融为一体。
      3.指针与一维数组
      理解指针与一维数组的关系,首先要了解在编译系统中,一维数组的存储组织形式和对数组元素的访问方法。
      一维数组是一个线形表,它被存放在一片连续的内存单元中。C语言对数组的访问是通过数组名(数组的起始地址)加上相对于起始地址的相对量(由下标变量给出),得到要访问的数组元素的单元地址,然后再对计算出的单元地址的内容进行访问。
    通常把数据类型所占单元的字节个数称为扩大因子。
      实际上编译系统将数组元素的形式a[i]转换成*(a+i),然后才进行运算。对于一般数组元素的形式:[],编译程序将其转换成:*(+),其中下标表达式为:下标表达式*扩大因子。整个式子计算结果是一个内存地址,最后的结果为:*=。
    由此可见,C语言对数组的处理,实际上是转换成指针地址的运算。
      数组与指针暗中结合在一起。因此,任何能由下标完成的操作,都可以用指针来实现,一个不带下标的数组名就是一个指向该数组的指针。
      4.指针与多维数组
      用指针变量可以指向一维数组,也可以指向多维数组。
    但在概念上和使用上,多维数组的指针比一维数组的指针要复杂一些。
      例如,在一个三维数组中,引用元素c[i][j][k]的地址计算最终将换成:*(*(*(c+i)+j)+k)。了解了多维数组的存储形式和访问多维数组元素的内部转换公式后,再看当一个指针变量指向多维数组及其元素的情况。

    1 指向数组元素的指针变量
      若有如下说明:
      int a[3][4];
      int *p;
      p=a;
      p是指向整型变量的指针;p=a使p指向整型二维数组a的首地址。
      *(*(p+1)+2)表示取a[1][2]的内容;*p表示取a[0][1]的内容,因为p是指向整型变量的指针;p++表示p的内容加1,即p中存放的地址增加一个整型量的字节数2,从而使p指向下一个整型量a[0][1]。

    2 指向由j个整数组成的一维数组的指针变量
      当指针变量p不是指向整型变量,而是指向一个包含j个元素的一维数组。如果p=a[0],则p++不是指向a[0][1],而是指向a[1]。这时p的增值以一维数组的长度为单位。
      5.指针与字符数组
      C语言中许多字符串操作都是由指向字符数组的指针及指针的运算来实现的。
    因为对于字符串来说,一般都是严格的顺序存取方式,使用指针可以打破这种存取方式,更为灵活地处理字符串。
      另外由于字符串以′\0′作为结束符,而′\0′的ASCII码是0,它正好是C语言的逻辑假值,所以可以直接用它作为判断字符串结束的条件,而不需要用字符串的长度来判断。
    C语言中类似的字符串处理函数都是用指针来完成,使程序运行速度更快、效率更高,而且更易于理解。

    展开全文
  • 关于指针这一节,让不少人又爱又恨,爱其对操作数据提供便利,恨其要是失去控制,要定位其原因要花很长时间 指针 指针,即为地址,就像是在某小区中,假如,某个人住在A区1306,那么A区1306就是这个人住得地址,当你...
  • 数组地址偏移与指向数组指针偏移的关系 引言: 在学习C语言过程中,使用数组的情况比较多,那么这里简单描述一下比较容易踩坑的数组地址的问题。 一、数组地址偏移与指向数组指针偏移 例如,定义一个数组,如下: ...
  • 有整形指针,字符指针,数组指针,结构体指针,函数指针等等。 整形指针: int a=10;int *p=&a;*p=20;//则a的值,通过p指向a,通过a的地址改变了a的内容,此时a=20; *p(对指针解引用),解引用是指针指向其对应...
  • 在c/c++中定义数组时int a[10], a表示数组首元素的地址,&a代表的是数组的地址,a+1偏移4个字节,&a+1偏移40个字节(10*4=40) (1) 数组类型 使用typedef定义数组类型 //定义一个数组类型 ...
  • c语言利用指针数组的最大值与最小值,下载资源,数组可扩展。
  • c语言指针应用 #include <stdio.h> //首先要明白数组的一些特性 //1.函数传递数组形参,只传输数组指针,也就是指向数组元素的指针 //2.第二个参数类型就是一个二维数组,元素类型也就是int [7],所以指针...
  • 要谈多维数组,首先先了解下一维数组指针应用。 int arr[10]; 通过上述代码,我们定义了一个长度为10的整形数组。 int为数组的基类型,他确定了每个数组元素所占用的空间。在visual studio编译器中int占4个字节。...
  • C语言二维数组指针(指向二维数组的指针)详解

    万次阅读 多人点赞 2020-05-27 17:43:22
    如有需要,请访问C语言二维数组指针(指向二维数组的指针)详解 二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有“缝隙”。以下面的二维数组 a 为例: int a[3][4] = { ...
  • c语言指针数组参数传参 数组指针的联系和应用是密不可分的,看一下数组作为函数参数是怎样的应用情况,我们看一段代码并进行分析 #include <stdio.h> int SumArray(int A[],int size) { int i,sum=0; ...
  • 指针数组应用(malloc申请) 学习指针数组后结合题目写了一些代码,留下记录 需求描述: 要求先输入要几套方案,每套方案都有五种类型的卷子 再依次输出每套方案的配备 五个参数分别是 A B C D E类型的卷的数目 再...
  • C语言数组的定义与使用

    千次阅读 2020-08-27 01:55:38
    C语言数组的定义与使用 数组的定义与使用 2.从语义上说:数据的组合 code array.c #include<stdio,h> //数组作为函数的参数时被转换为指针 void display_arry(int arr[10]) { for(int i=0;i<sizeof...
  • 介绍数组中 地址+n操作 所代表的的意义 一维数组 初始化数组 A[3] = {1,2,3}; 遍历数组 sizeof(int) = 4,即一个int大小为4个字节,可见每个元素间隔4个字节 代码 值 指向的值 即:*(代码) &A[0] 0X...
  • C语言数组指针 作为形参

    千次阅读 2015-06-05 21:33:48
    在修改程序的过程中,看到两种将数组作为形参的方法,于是搜了一下,找了一下比较全面地介绍数组指针的文章。 先写下我遇到的两种方式: 方式1: void filter_c(long double *,long double *,float *,int);//函数...
  • LOGO 数组与指针一维数组地址和指针 主讲人周芸 教学目标 掌握一维数组的指针的用法 理解一维数组指针的本质 具备应用一维数组指针编程的能力 张丽去排队打疫苗医生通过叫号的方式依次注射 引入 一指向一维数组的...
  • C语言数组指针在汇编语言寻址方式中的应用.pdf
  • C语言指针数组详解

    千次阅读 多人点赞 2019-03-06 12:59:37
    指针数组是 C 语言中很重要的两个概念,它们之间有着密切的关系,利用这种 关系,可以增强处理数组的灵活性,加快运行速度,本文着重讨论指针数组之 间的联系及在编程中的应用。 1.指针数组的关系 当一个指针...
  • c语言数组越界的避免方法

    千次阅读 2019-09-08 16:27:15
    1、尽量显式地指定数组的边界 #define MAX 10 … int a[MAX]={1,2,3,4,5,6,7,8,9,10}; 在 C99 标准中,还允许我们使用单个指示符为数组的两段“分配”空间,如下面的代码所示: int a[MAX]={1,2,3,4,5,[MAX-5]=6,7...
  • 大家好,首先感谢朋友们的阅读和点击,在过去我们说了内存缓存数组等一些重要知识点,今天就来说说C语言学习中另一个最重要,也比较难懂的一个知识点,那就是指针C语言学习提前声明,每个都在学习了指针后都有自己...
  • 数组指针其实就是行指针,本文着重讲解了一维和二维,如果实际代码中遇到了更多维数的指针也一样可以运用这种嵌套的思想来理解。编程最重要的就是理解其底部的思想。
  • (转载)深入解析C语言数组指针 原文地址:https://www.cnblogs.com/maluning/p/7955648.html 概述  指针是C语言的重点,同时也是让初学者认为最难理解的部分。有人说它是C语言的灵魂,只有深入...
  • 函数指针(指向函数的指针) 一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似。我们可以把函数的这个首地址(或称入口地址)赋予一个指针...
  • 1.二维数组 1.1、二维数组的内存映像 (1)一维数组在内存中是连续分布的多个内存单元组成的,而二维数组在内存中也是连续分布的多个内存单元组成的。 (1)从内存角度来看,一维数组和二维数组没有本质差别。 (2)二维...
  • C语言指针——指针数组应用

    千次阅读 2018-05-23 13:59:52
    #define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <string.h>...//指针数组经常用于菜单查找 int searchKeyTable(const char* table[], const int size, const char* key, i...
  • 数组指针在各类编程语言中,都很重要,数组应用很广泛,理解基础很必要
  • 目录数组指针通过指针遍历数组(一)通过指针遍历数组(二)通过指针遍历数组(三)通过指针遍历数组(四)数组指针易混淆点数组元素找最大值数组逆置数组元素找第二大值字符串指针计算字符串长度合并字符串汉字字符串逆置 ...
  • 前言:在上一篇文章中说到了指针变量和普通变量的区别,那么这一篇文章中就来说说指针数组的关联。指针和数组有相似之处,却又不尽相同。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 72,014
精华内容 28,805
关键字:

c语言数组指针的应用

c语言 订阅