精华内容
下载资源
问答
  • 如果一个数组中的所有元素保存的都是指针,那么我们就称它为指针数组指针数组的定义形式一般为: dataType *arrayName[length]; [ ]的优先级高于*,该定义形式应该理解为: dataType *(arrayName[length]); ...
  • 数组指针和指针数组,从字面上区分的方法就是:本质看最后两个字。例如数组指针的本质就是一个指针,一个指向数组的指针;而指针数组的本质就是一个数组,一个成员都是指针的数组。 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 *说明该数组中每个元素的数据类型都是“整形指针类型”。

    展开全文
  • 在学习计算机编程的时候,最重要的就是多思考多练习,才能理解其中的原理、算法,下面ITmemo分享一段我学习c语言基础之后写的一段c语言指针数组冒泡排序代码,其实就是从常规代码改为指针方式进行数组排序而已。...

    在学习计算机编程的时候,最重要的就是多思考多练习,才能理解其中的原理、算法,下面ITmemo分享一段我学习c语言基础之后写的一段c语言指针数组冒泡排序代码,其实就是从常规代码改为指针方式进行数组排序而已。

    #include

    int main(void)

    {

    int arr[] = { 3,1,0,9,5,4,2,6,7,8 };

    int * p = arr;

    int len = sizeof(arr) / sizeof(arr[0]);

    printf("数组长度:%d\n", len);

    for (int i = 0; i < len-1; i++)

    {

    for (int j = 0; j < len-1-i; j++)

    {

    //指针得到数组下标对应的值

    //printf("%d\n",*(p+j));

    if (*(p+j)>*(p+j+1))

    {

    int temp = *(p + j + 1);

    *(p + j + 1) = *(p + j);

    *(p + j) = temp;

    }

    }

    }

    for (int i = 0; i < len; i++)

    {

    printf("排序后的数组为:%d\n", arr[i]);

    }

    getchar();

    return 0;

    }

    展开全文
  • 关于C语言指针数组的一些理解 最近在准备考研复习数据结构,重新拿起来好久不用的C语言,在学习的过程中发现了之前没有学习到的知识点-----指针数组。虽然感觉指针数组很少会遇到和用到(至少在学习阶段),但我感觉...

    关于C语言指针数组的一些理解


    最近在准备考研复习数据结构,重新拿起来好久不用的C语言,在学习的过程中发现了之前没有学习到的知识点----- 指针数组。虽然感觉指针数组很少会遇到和用到(至少在学习阶段),但我感觉搞懂指针数组对于本来就不是很理解指针的人有很大帮助,因此在这里写下自己的一些浅薄之见供大家参考,我理解不对的地方还请大家指正。

    在这里插入图片描述
    众所周知,就像下面这段代码一样,要初始化一个int类型的指针,就要传入一个int类型变量的地址。

    int number=0;
    int *numbertoken=&number;
    

    那么我们能不能定义一个指向指针的指针呢?

    int ** numbertwicetoken;
    

    那我们在初始化它时传入的应该是&numbertoken,也就是numbertoken的地址,而不是numbertoken,因为在这里numbertoken的值是number的地址。

    numbertwicetoken=&numbertoken;
    

    那我们再来看下面的代码

    	char string[]="hello world";
    	char *stoken=string;
    

    在这里我们初始化字符指针时传入的是string而不是&string,这是因为在存储数组中,string存储的是数组中第一个元素的地址,而&string的含义是整个数组的地址,但如果你尝试以整形打印string和&string你会发现他们的值是一样的,也就是说数组的地址就是数组第一个元素的地址。那么问题来了,我是否能将代码写成这样呢?

    char *stoken=&string;
    

    在这里插入图片描述
    显然是不可以的,这里的&string是数组的地址,而我们定义的指针是字符指针,应该传入字符的地址,而&string应该传入到数组指针中,注意这里是数组指针,而不是指针数组。顾名思义数组指针是指指向数组的指针,让我们来看它的定义方式:

    char (*stoken)[12]=&string;
    

    注意重点这里的*stoken是在括号里的,在C语言中()的优先级要大于[],所以stoken要先是一个指针,因此这里stoken是一个指向数组的指针。
    那么那么那么,如果去掉括号呢,那就是这次的主角了-----指针数组
    指针数组,就是数个指针组成的数组,该数组中的每一项都是一个指针,下面我们来看指针数组的声明方式

    char * string2[]={"hello","world"};
    

    在C语言中[]的优先级要高于星号因此 string要先是一个数组,所以string2是一个指针数组。
    为了继续探究指针数组的难点,首先让我们先回到刚刚声明的字符数组string,刚刚我们说过string的值是该数组中第一个元素的地址,因此*string得到的值将是该数组的第一个元素的值也就是“h”

    printf("%c\n",*string);//输出结果为h
    

    咱们会发现这一点与指针一模一样,但string是一个指针吗?
    并不是。
    表面上看string是一个指向“h”的字符指针可以实现和stoken一样的功能。但如果我们用二重指针来测试一下

    char **stwicetoken=&string
    char **stwicetoken=string
    

    这俩段代码是会报错的,第一个的原因是&string是数组地址,而第二个是应该是赋值给stoken这种第一层指针。
    那么再让我们回到我们的指针数组string2上来,
    这时如果我们这样编写一段代码就完全不会出错

    char **stwicetoken=string2;
    

    好多小伙伴第一次看到这段代码可能会一懵
    在这里插入图片描述
    但其实只要深入思考一下就会发现这很合理。
    在这里插入图片描述
    string2是一个指针数组,string2的值是这个数组第一个元素的地址,而这个是个指针数组,所以第一个元素也就是string2[0]是指针!所以这段代码就相当于

    char **stwicetoken=&string2[0];
    

    在这里插入图片描述
    那我们来继续缕一缕整个指针数组的地址问题。
    首先我们知道string2的值就是string2[0]的地址值,那可能有人就要想了,那string2[0]是一个字符数组,所以string2[0]的地址就是字符数组的首元素的地址,因此string的值就是“h”的地址值。这是不对的!!!!
    在这里插入图片描述

    要注意string2[0]是一个指针,它指向了"hello"这个字符数组,因此他的值是"hello"这个字符数组的首地址,而string2[0]的地址则是另一个值,这就相当于之前的字符指针&stoken与stoken的区别(stoken的值是string的地址,而stoken也拥有自己的地址&stoken),而不是像字符数组&string与string的值相等一样(数组的地址就是数组首元素的地址)。因为stoken是一个指针,而string是一个字符数组!!字符数组的地址等于它首元素的地址,而指针不是。
    画了一个草图帮助大家理解一下:
    在这里插入图片描述

    因此执行下列代码得到的结果是一样的。

    	printf("string2[0]:%d\n",string2[0]);
    	printf("*string2:%d\n",*string2);	
    

    因为string2[0]是string2数组中首元素的值,而string2指向string2[0]的地址,而*string2便是string2[0]的值,所以这两段代码取到的都是"hello"这个字符数组的首地址。
    同理

    	printf("string2[1]:%d\n",string2[1]);
    	printf("*(string2+1):%d\n",*(string2+1));
    

    这哥俩取到的便是"world"这个字符数组的首地址
    再看这段代码

    printf("*string2+1:%s\n",*string2+1);
    

    得到的则是字符串"ello",这是因为我们在*string2的基础上加一,便是使指针从"hello"的首地址向后移一位,指向了第二个元素"e"的地址

    那么再看这两行代码

    	printf("*string2[0]:%c\n",*string2[0]);
    	printf("**string2:%c\n",**string2);
    

    取到的则是"h"这个字符,因为*string2与string2[0]为"h"的地址。

    	printf("&string2[0]:%d\n",&string2[0]);
    	printf("string2:%d\n",string2);
    

    这两段代码得到的是string[0]这个指针的地址

    	printf("*string2[0]:%s\n",string2[0]);
    	printf("**string2:%s\n",*string2);
    

    这两段代码的打印结果则为”hello“

    个人感觉指针数组可以帮助大家缕清指针与指针直接地址的关系,对学习C语言有很大的帮助,这篇文章也就相当于我自己的学习笔记了,拿出来和大家交流一下(主要目的是找找大腿抱一下)。

    展开全文
  •  C语言中的所有变量都是存储在一块内存中的。以32位机器为例,char型的变量存储在一块1字节的内存中,int型的变量存储在一块4字节的内存中。指针本质上也是个变量,也存储在一块4字节的内存中。只不过指针那块内存...

    什么是指针

      C语言中的所有变量都是存储在一块内存中的。以32位机器为例,char型的变量存储在一块1字节的内存中,int型的变量存储在一块4字节的内存中。指针本质上也是个变量,也存储在一块4字节的内存中。只不过指针那块内存中存储的是一个地址而已。我们可以把某个变量的4字节地址存储在指针的那块内存中。想要操作变量的时候,先从指针的内存中得到那个变量的地址,然后在根据地址操作对应的那个变量的那块内存。

      int num = 10;

      int *p = &num;   // 取num的地址存在p指针的内存中

      *p = 100;          // 指针的解引用语法,从指针的内存中的到num的地址,然后操作num对应的内存。相当于num=100

     

    数组名和指针的区别联系

      int array[10] = {0};

      int *p = array;

      array是数组名,数组第一个元素的地址,是一个常量,不能用于算数运算,array++, array+=1这些运算都是不允许的。指针和它的区别是,指针是一个变量,也就是说,指针的那块内存中你想存啥就存啥。比如 p += 1,,就相当于把指针那块内存中存的值改变了。int *p = array 相当于把array中第一个元素的地址存在指针对应的那块内存中。对数组名使用sizeof,会返回整个数组的大小。但是对指针使用sizeof,只会返回4字节(32位机器)。所以数组名和指针完全是两码事,数组名是常量,而指针本质上是个变量。它们唯一的联系是如下代码中展示的:

      void func(int a[]);

      void func(int *a);

      以上两种声明方式编译器都会把a理解为一个指针,所以这两个声明是一样的。C语言传参方式是按值传递,当把数组名作为参数传进去的时候,因为把数组名直接作为右值会得到第一个元素的地址,所以相当于把数组第一个元素的地址存储到了a对应的内存中。这也是常说的数组名转换为指针的本质。其实和上面的代码: int *p = array 本质上是一样的,都是把数组名代表的地址赋值给了指针。

     

    数组指针和指针数组

      <1> 数组指针

        int (*p)[3] ;   因为()的优先级高,所以*运算符先把p声明为一个指针。然后后面的方括号和3使编译器把p解释为一个指向长度为3的一维数组的指针。数组指针一般用于指向二维数组如:

        int a[2][3];    // 相当于2个长度为3的一维数组。

        int (*p)[3];

        p = a;

        p++;  // 指针加减是让指针移动sizeof(指针类型)个单位,p的类型指向长度为3的int型一维数组的i指针。是所以p移动了4 * 3字节

       <2>指针数组

        int *p[3];    []优先级高,所以[]先把p声明为一个数组。然后*使编译器把p解释为,p是一个一维数组,其中每个元素的类型是int *。

       这里需要理解清楚,数组指针是一个指针,在32位机器上就是一块4字节的内存,所以只能保存一个地址。在C语言中一般用来指向二维数组。但是指针数组是一个数组,每个元素是一个指针,所以指针数组能用数组的方式保存多个指针,也就是每个数组元素对应内存中存储的其实是某个变量的地址。

     

    二级指针

      二级指针是指针的指针。说白了,就是二级指针对应的那块内存中存储的是另外一个指针的地址。比如:

      int num1 = 10;

      int num2 = 20;

      int *p1 = &num1;

      int **p2 = &p1;

      *p2 = &num2;    //1

      *p1 = 30;           //2

      **p2 = 40;          //3

      这是,p2对应的那块内存中存储的是p1的地址,而p1那块内存中存储的是num1的地址。*p2代表p1那块内存的地址,所以代码1表示p1那块内存中存储num2的地址。代码1之后,*p1对应内存中的值被改成num2的地址了,所以*p1代表num2对应的那块内存。所以代码2的意思是让num2的那块内存存储30。*p2取到的是p1那块内存的值,也就是num2的地址。**p2代表的是num2对应的那块内存。所以代码2代表把num2的值改为30.

      从这里可以看到,我们没有动p1, 但是p1的指向改变了,这就是二级指针最重要的作用。比如有以下场景:

      int getMem1(int *p)

      {

        p = (int *)malloc(sizeof(int));

      } 

      int getMem2(int **p)

      {

        *p = (int *)malloc(sizeof(int));

      }

      int main()

      {

        int *buf;

        //getMem1(buf);    // 错误,C语言中按值传参,形参p对应的内存在getMem1中存储了新申请内存的起始地址,和buf一点关系都没有。

        getMem2(&buf);    // 正确,在getMem2中,形参p中存储的是指针buf的地址,*p代表的是指针buf对应的那块内存,也就是buf那块内存被赋值为新申请内存的起始地址,在子函数中改变了main函数中buf指针的指向。

      }

      因为一级指针不能再子函数中改变自己的指向,所以只能通过二级指针来改变。这也是二级指针最有用的地方。

     

    指针数组和二级指针的联系

      int *p[10];

      指针数组中的每个元素是一级指针,如果我想改变某个元素(某个指针)的指向,只需要这样:

        p[0] = (int *)malloc(sizeof(int));

        p[1] = (int *)malloc(sizeof(int));

      二级指针的作用也是改变一级指针的指向,这样就把指针数组和二级指针联系起来了。

      int **p2 = p;

      *p2 = (int *)malloc(sizeof(int));

      *(p2 + 1) = (int *)malloc(sizeof(int));

      和上面的代码效果是一样的。*p2代表指针p第一个元素的那块内存。p2是指针的指针,它指向的类型是int *, 所以p2+1表示移动一个int*的位移,这和p+1移动的原理是一样的。

     

      

    转载于:https://www.cnblogs.com/MyOnlyBook/p/9484745.html

    展开全文
  • 絮:本来是理解数组指针,指针数组和指针与数组的关系的,本来今天想让自己加深理解一下,结果跳进坑来了,脑子有点乱。整理一下,让自己清醒一些。如果有人翻到这边博文我由衷给你一个建议,学习C语言一定要...
  • 指针数组 元素为指针的数组,如:int* p[n],p是一个数组,数组中元素为int*,且有n个元素。 数组指针(行指针) 指向数组的指针,如:int (*p)[n],p是一个指针,指向数组的指针,且数组种有n个int元素。由于[]的...
  • C语言 指针数组和指向指针的指针

    千次阅读 多人点赞 2019-05-22 16:44:29
    指针数组的概念: 一个数组的元素值为指针则是指针数组指针数组是一组有序的指针的集合。 指针数 组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。 指针数组说明的一般形式为:类型说明符 ...
  • 1.指针数组 2.数组指针 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.简介 1.数组 数组中的每个元素都有一个序号,这个序号从 0 开始,称为下标index,例如,a[0] 表示...
  • 相信大家之前都接触过数组了,除了字符数组的应用,在C语言中其实还有指针数组的引用。那么到底什么是指针数组呢?它的作用又是什么呢?下面课课家小编就为大家简单介绍C语言中的指针数组的概念和作用。首先小编先给...
  • 关于指针这一节,让不少人又爱又恨,爱其对操作数据提供便利,恨其要是失去控制,要定位其原因要花很长时间 指针 指针,即为地址,就像是在某小区中,假如,某个人住在A区1306,那么A区1306就是这个人住得地址,当你...
  • C语言:数组指针和指针数组的区别

    千次阅读 2018-05-08 01:10:22
    1. 数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二...
  • 搜索热词C语言 指针与数组的详解及对比通俗理解数组指针和指针数组数组指针:eg:int( *arr)[10];数组指针通俗理解就是这个数组作为指针,指向某一个变量。指针数组:eg:int*arr[10];指针数组简言之就是存放指针的...
  • 指针数组C语言中很重要的两个概念,它们之间有着密切的关系,利用这种关系,可以增强处理数组的灵活性,加快运行速度,本文着重讨论指针数组之间的联系及在编程中的应用。  1.指针数组的关系  当一个指针...
  • 二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,...C语言中的二维数组是按行排列的,也就是先存放 a[0] 行,再存放 a[1] 行,最后存放 a[2] 行;每行中的 4 个元素也是依次存放。数组 a
  • C语言指针数组(数组每个元素都是指针)详解 C语言二维数组指针(指向二维数组的指针)详解 如果一个数组中的所有元素保存的都是指针,那么我们就称它为指针数组。指针数组的定义形式一般为: dataType *arrayName...
  • /*括号是必须写的,不然就是指针数组;10是数组的大小*/1拓展:有指针类型元素的数组称为指针数组。2.通过指针引用数组元素的基本方法(1)小标法:a[i]。(2)指针法:* (a+i) 或 * (p+i) 或 p[i]。其中,a是数组名,p...
  • #include int main(){ int all[5]; int *putin(); int *p=putin(); for(int k=0;k;k++,p++) printf("%d ",*p);... 代码如上图,输出结果里有数值有地址,无法理解哪里的逻辑有问题,请指教,万分感谢!
  • 采用类比和等效法解决一个数组指针在指向数组中的元素时,又指向了一个p[size]数组理解 代码例图 char *lines[5] = //数组指针 { "COSC1283/1984", "Programming", "Techniques", "is", "great fun" ...
  • c语言-指针数组

    千次阅读 2018-11-10 22:53:05
    指针 内存和地址怎么理解呢? 机器中有一些位置,每一个位置被称为【字节】/byte,许多现代机器上,每个字节包含8个位。更大内存单位【字】,通常包含2个或4个字节组成。 一个字包含4个字节,它的地址是什么? 他...
  • 第一次写博客,有点小激动。话不多说,进入正题。... 包括指针函数、函数指针、指针数组和数组指针,先从根本上介绍这几者的区别。 为了直观理解,下面具体介绍: 1.1 数组指针 ...
  • int (*a)[10]表示一个指向一个整形数组指针这个好理解,但是为什么int (*a)[]可以编译通过呢
  • C语言数组指针_3

    2021-05-21 09:38:45
    C语言中的数组指针与指针数组:·数组指针一、区分首先我们需要了解什么是数组指针以及什么是指针数组,如下:int *p[5];int (*p)[5];数组指针的意思即为通过指针引用数组,p先和*结合,说明了p是一个指针变量,指向...
  • c语言指针数组和数组指针-解释和用法

    千次阅读 多人点赞 2019-06-15 19:51:21
    数组指针与指针数组: 优先级:()>[]>* 首先我们要说的一个知识点是 int *p[3] 和 int (*p)[3]的区别 int (*p)[3] 因为()优先级高,首先说明p是一个指针,指向一个int型的一维数组, 数组有3个元素,每个...
  • 详解C语言指针函数、函数指针、函数指针数组

    万次阅读 多人点赞 2018-07-09 11:08:24
    而在指针中,指针函数、函数指针、指针函数数组、函数指针数组、指向函数指针数组的指针等等概念看着又绕又头疼。本问总结了一下以上一些概念以及用法,并给出例程深化理解。 1. 指针函数 指针函数就是返回指针值...
  • C语言数组指针的区别

    千次阅读 多人点赞 2018-09-20 19:38:49
    对数组的引用总是可以写成对指针的引用,而且确实存在一种指针数组的定义完全相同的上下文环境。 但是指针和数组还是在本质上是不一样的。指针就是指针指针变量在32位的系统下面是4Byte,而在64位系统下面是8...
  • 打开搜狗搜索APP,查看更多精彩资讯C语言数组指针:我们都知道,一个普通的数组,它的所有元素都是连续排列的。那么数组名就代表着所有的内存吗,答案是明显的,肯定不是,我们前面说过,这些变量名数组名等都只是...
  • 指针数组:指针的数组,它是一个数组,数组中存放的内容为指针。 2优先级 优先级为 () &gt; [] &gt; * 比如int (*p)[n],因为()的优先级最高,p先于*结合,所以p是一个指针,后面是数组,于是这个就是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 79,078
精华内容 31,631
关键字:

c语言指针数组理解

c语言 订阅