精华内容
下载资源
问答
  • 指针数组和数组指针 首先就有一个问题摆在大家面前,指针数组到底是...int arr1[10] 是指针数组,arr1[ ]的结合性更高一些,所以arr1先与[ ]结合成为数组,数组有10个元素,每个元素的类型都为int 型,所以 in...

    指针数组和数组指针

    首先就有一个问题摆在大家面前,指针数组到底是指针还是数组?数组指针是数组还是指针?
    答:指针数组是数组,是一个存放指针的数组。数组指针是指针,存放数组的地址

    举个栗子来区分以下指针数组和数组指针
    int arr1[10]   是指针数组,arr1和[ ]的结合性更高一些,所以arr1先与[ ]结合成为数组,数组有10个元素,每个元素的类型都为int 型,所以 int *arr1[10]是存放整型指针的数组。

    int ( * p)[10]   是数组指针,p先与*结合,说明p是一个指针变量,指向了一个大小为10的整型数组,所以p是一个指针,指向了一个数组,叫数组指针

    数组指针的使用

    int arr[10] = {0};
    arr//表示数组首元素的地址
    &arr//表示数组的地址   arr与&arr的值是相同的,但意义不一样,再加一之后的值不相同
    arr+1//跳过一个元素
    &arr+1//跳过整个数组
    

    数组地址的存储

    int arr[10] = {0};
    int *p1 = &arr;//p1是整型指针,&arr取出的是数组的地址,所以表达错误
    int (*p2)[10] = &arr;//p2是数组指针,存放数组的地址是合适的
    

    举个栗子:二维数组的传参问题
    arr数组名表示首元素的地址,表示第一行地址,第一行是一个二维数组

    void print(int arr[3][4],int row,int col) //arr[3][4]也可写成(*arr)[4]
    {
       int i = 0;
       int j = 0;
       for(i = 0;i < row;i++)
         {
            for(j=0;j<col;j++)
              {
                printf("%d",arr[i][j]); //arr[i][j]也可写成*(*(arr+i)+j)分析如下
              }
                printf("\n");
          }
    }
    

    arr+i ~~在i=0时指向第0行
    *(arr+i) ,解引用,找到这行对应的元素,这一行的数组名相当于首元素地址
    *(arr+i)+j这一行第j个地址
    * ( *(arr+i)+j)表示第i行第j个元素,和arr[i][j]意义相同

    指针和数组的定义与声明

    首先说明,定义为指针就要声明为指针,定义为数组就要声明为数组
    下面说说定义为数组,声明成了指针的情况,这种错误还是尽量要避免的
    这里写图片描述
    这里写图片描述
    把数组声明成了指针的形式,语法上没有检测出问题,但是结果有错,如下图
    这里写图片描述
    具体分析:声明成了指针的形式,指针只占四个字节,所以在定义的数组中只传来了四个字节的内容,把abcd的ASCII组成的四个字节当成地址即ox64636261
    而要输出的是数组的内容,首先要拿到”abcdef”中首字母a的地址
    arr本来就是char*类型的,取出的a的地址就是char * 类型的,想要char 类型且是a的地址,对其进行强制类型转换
    综上所述,就是讲arr改为(char *)&arr
    接下来讨论一下定义为指针,声明成数组的情况
    这里写图片描述
    这里写图片描述
    这里写图片描述
    结果是随机值
    具体分析:在定义的指针中,p中存的是a的地址,p是4个字节
    在声明的数组中,最多有四个元素,printf中的p就是数组名,表示首元素地址,p有四个元素
    p中的四个元素就是将a的地址划分为四个元素,所以输出的p就是a的地址划分的元素,为随机值
    这里写图片描述
    还是要输出”abcdef”的话,就要在printf后面p的位置上放a的地址。
    整型指针解引用是四个字节,所以a的地址就可以表示为* ( int )p ,再将其强制类型转换成char 型,即就是所需要的地址类型
    另一种改正方法:* (char**)p ,将p强制类型转换成char* * ,再将其解引用刚好为四个字节,也是char * 类型

    展开全文
  • 二级指针和数组

    千次阅读 2019-04-24 23:04:09
    数组名的三个特殊话 调用函数 下一个函数调用时,空间全部覆盖成cccccc 栈帧 于函数 ...二级指针和数组的关系 p = 地址 *p = 数值 **p =&p 二级指针指向一级指针的地址、、 a = 0012ff00 *a =1...

    数组名的三个特殊话

    数组名的三个例外 
    1.数组名做长度 sizeof(ar) 只关心大小 等于长度 
    2.取数组地址 指针指向数组地址 数组地址= 大小加类型 int *p[10]	数组 是个空间 每个空间放指针 时指向int的指针 p标识符 数组名 放的整形类型的地址 存放地址 int (*s)[10]	指针 指向数组 十个空间 每个空间放的整形 s标识符 s开辟四个地址 存放变量 
    3.数组初始化一个引用 数组名=大小加类型 int ar[10] ={0}; int (&b)[10] = ar; 剩下都是首地址
    
    下一个函数调用时,空间全部覆盖成cccccc
    栈帧 于函数
    从底到顶  从高到低
    函数变量 从高地址到低地址赋值(从下到上)
    数组 从上到下 是赋值的从左到右  和参数入栈一样 从(从右向左 从下到上)(从左到右)从上到下
    

    二级指针和数组的关系

    指针都有两个值 一个是自身的值 一个是指向的值
    p = 地址(自身的值)
    *p = 数值(指向的值)
    **p =&p 二级指针指向一级指针的地址

    a = 0012ff00
    *a =10
    &a = 0012fe08

    p=0012fe08
    *p=0012ff00

    *s =p
    **s = *p = a;

    int a = 0x123456;
    int *ip =&a;
    char *cp = &a;
    
    cp == char *
    &a  == int *
    
    小端存储 高地址存高位
    大端 高地址存低位
    char指针 自增+1
    int 指针 自增+4
    

    在这里插入图片描述

    展开全文
  • 指针和数组的异同

    千次阅读 2017-07-28 11:24:37
    指针和数组的异同点 在某些时候,指针和数组可以混淆,有的时候却不行,那么我们应该怎么认识指针和数组呢?我们需要从定义去理解它们。 首先指针变量是用来存放某种类型的地址的变量,定义一个整型的指针:int* p...

    指针和数组的异同点

    在某些时候,指针和数组可以混淆,有的时候却不行,那么我们应该怎么认识指针和数组呢?我们需要从定义去理解它们。

    首先指针变量是用来存放某种类型的地址的变量,定义一个整型的指针:int* p,定义了一个指针后,编译器会为指针分配一个地址空间,空间大小是指针的大小,类型定义只是在告诉编译器,这个指针标量存放的是什么类型的地址,并不影响指针的空间分配,就是说char*p,和int*p1,p和p1的空间分配大小是一样的,不一样的是p存放的是整型变量的地址,p1存放的是字符型变量的地址,并且移动的时候,是按照类型的内存空间大小进行移动,例如:在x86的环境下,字符型的变量是1个字节,整型变量是4个字节,p移动的时候是一个字节一个字节的移动,p1移动的时候是4个字节,4个字节的移动。指针变量里,只能放地址,就是我们常说的左值,不能把一个非地址的常量赋值给指针,那样是错误赋值。例如:int*p=2;

    数组的定义,数组就是存放一定数量变量的内存空间,定义的时候,编译器会根据你的定义为数组分配适当的内存空间。例如chararray[10],编译器会给array分配10个字节的内存空间,如果定义为int array[10],在x86环境下,就会分配40个字节的内存空间,在单片机里,就会分配20个字节的内存空间。数组里面存放的变量类型取决于定义的类型,可以是常量数组,也可以是指针数组。也就是说数组里的变量可以是常量,可以是变量,只要用户去定义数组的类型就可以了。

    从定义上看,指针和数组是有很大的区别的。

    那么在什么时候,数组等同于指针呢?在作为函数传递参数的时候,数组是等同于指针的,为什么呢?因为,数组在作为参数传递或者调用数组的时候,通常都是把数组首元素的地址作为参数来传递或者调用,这个时候数组名就相当于数组首元素的地址,也就是指针了。就是说void test (int array[]); void test (int * array),这两种函数声明其实都是一样的,形参这都是&array[0];只是表达的方式不一样。

    在使用下标的时候,二者的用法相同。都是原地址加上下标的值,不过数组的原地址就是数组首元素的地址是固定的,指针的原地址就不是固定的,指针指向那个元素,该元素的地址就是要加上下标之前的原地址,因为这样,这样指针的灵活性很大。

    还要搞清楚一个知识点,指向数组的指针:int(*p)[10];和指针数组int*p1[10],二者的区别。举个例子,一个二维数组int array[5][10],想要指针对数组的元素进行改写或运算,首先要对指针进行正确的赋值。那么这么赋值:int*p =array对不对呢?答案是否定的,你的意思是定义一个整数类型的指针,指向了一个二维数组array[0]?那么为什么错呢,因为array[0]是一行有十个元素的数组,并不是一个整型变量!正确的定义的方法就是:int(*p)[10]= array;或者int *p = array[0][0];如果直接操作数组名取得array[1][5]的元素,除了了用下标,用数组名作为指针的取元素方法是:*(*(array+1)+5),因为array+1其实还是一个指针,他是指向了第二行第一个元素的指针,想要取得元素,必须要要再解引用一次。但是如果混淆了指针和数组,很容易会定义出:int**p = array;这就变成了定义了一个指向指针的指针,然后把一个数组给了这个指针,显然是不对的。

     

     

    int_Paul

    2017年7月28日11:09:38

     

    展开全文
  • 指针 指针数组 指针数组的指针 数组指针 数组指针的数组 函数指针 函数指针数组 指向函数指针数组的指针

           指针是c语言的灵魂所在,然而因为其过于灵活,在使用的过程中难免出错。接下来我们简单分析一下常见的指针运用。

    指针:

         1  一级指针

             char *p1 =  “abcdef”;

          2  二级指针

             char **p2 = &p1;

    指针数组:

         1 char *arr[5] ;  (在数组中存放5个char* 指针)

    指针数组指针

         1 char* arr[5];

            char * (*parr)[5] = &arr;

           parr就是指向指针数组arr的指针 (即parr为指针数组的指针)

    数组指针:

         1   int   arr[5] = {1,2,3,4,5};

              int  (*p)[5] = &arr ;          p即为指向数组的指针,又称数组指针

    数组指针的数组:

          int arr1[3] = {1,2,3};

          int arr2[3] = {4,5,6};

          int (*parr[2])[3]={arr1,arr2};


    函数指针:

      先写一个简单的函数

            int add(int x, int y)

             {

                return x+y;

             }

        int  (*pfun)(int, int);

                pfun = add;

    这样一来  pfun就是指向函数add的指针(即函数add的指针)。

    下面是定义一个函数指针的方法:



    指向函数指针数组的指针:

               函数指针数组也是指针数组,在这个数组中存放的是函数的指针

        eg: 我们先写加减乘除四个子函数。

             

            int (*pfunarr[4])(int, int) = {add, sub, mul, div};//这个数组就是函数指针数组      pfunarr就是指向函数指针数组的指针

    展开全文
  • c++指针和数组的区别

    千次阅读 2018-09-13 14:20:06
    总结下指针和数组的区别: 以字符数组为例简单说明下数组指针之间的区别: 1. char a[3]; 2. char *b=new char[size]; 3. const char *c; 4. string d; 相同点:a,b,c,d都表示的是地址; 不同点: (1). a[3...
  • 指针和数组的区别

    千次阅读 2016-07-20 19:43:45
    指针和数组的区别: 1.空间分配:数组是静态分配,且分配的空间是连续的;指针是动态分配,分配的空间不一定是连续的。 2.安全性:使用数组可能会造成数组越界;指针使用时可能会造成内存泄漏。 3.访问效率:数组...
  • c++指针(三)——指针和数组名的关系

    千次阅读 多人点赞 2018-05-08 08:46:26
    这一篇文章揭秘指针和数组名的关系~~~(1)、数组的定义int array[10];//定义了一个数组array,并且初始化都为0,数组为{0,0,0,0,0} int array[10]={1,2};//定义了一个数组array,并且初始化都为0,但是第一,第二个...
  • 我们先来分析它的名称,“指针数组”中的“指针”只是一个形容词,“数组”才是它的词根。那么我们就知道了:“指针数组”本质上是一个数组,是一个内含元素为“指针”的“数组”。 我们来举一个指针数组的例子帮助...
  • 娓娓道来c指针 (3)指针和数组

    千次阅读 多人点赞 2014-07-25 00:58:09
    在c中指针和数组似乎有着千丝万缕的关系。其实它们不是一回事:指针指针数组数组,两者不相同。
  • 指针和数组名的区别

    千次阅读 2012-03-11 21:42:05
    指针和数组名有如下区别: 区别1 数组名指代一种数据结构,这种数据结构就是数组; char str[20]; char *p=str; printf("%d \n",sizeof(str));//20 printf("%d \n",sizeof(p));//4 str指代数据结构——20个...
  • 在C语言中,数组和指针密切相关,几乎可以互相使用。数组名字可以认为是常量指针,它指向存放数组第一个元素的内存地址。指针可以用于完成任何涉及数组下标的操作。数组下标表示法在编译期间将转换为指针表示方法,...
  • C/C++ 指针和数组

    千次阅读 2019-01-29 20:41:39
    指针和数组基本等价的原因在于指针算术C/C++内部处理数组的方式。 #include &lt;iostream&gt; using namespace std; int main() { double wages[3] = {100.0, 200.0, 300.0}; short stacks[3] = {3, ...
  • 指针和数组的转换

    千次阅读 2015-11-15 19:22:52
    本人喜欢例子说明。。 #include int main() { int arr[4] = {1,2,3,4}; int *p_arr = arr; int i = 0; printf("数组正常打印\n"); for( i = 0; i ; i++) { printf("%d ", arr[i]);... printf("数组以指针形
  • 指针和数组的经典习题

    千次阅读 2018-03-25 00:01:56
    &数组 sizeof(数组名),这里的数组名都表示的是整个数组。 练习2: struct Test { int Num; char *pcName; short sDate; char cha[ 2 ]; short sBa[ 4 ]; }*p; int main() { ...
  • 指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)
  • 关于C语言你不知道的事(1)–...2.1 数组和指针是如何访问的 2.2 数组和指针可以相同么 1 一个很多人都会做错的面试题 仔细查看以下代码,print_arr_addr和print_g_arr_addr的打印输出地址相同么?为什么 #i
  • 指针数组 首先从名字就可以知道这是一个数组,是存放指针的数组。 先看几种指针数组: int * 数组指针 函数指针 函数指针数组 指向函数指针数组的指针
  • 指针和数组的定义与声明

    千次阅读 2018-06-10 17:38:55
    在这里我们做种强调的是在两个文件中,定义为数组声明为指针和定义为指声明为数组的这辆中情况。那么我们就需要两个源文件test.cmain.c。 定义为数组,声明为指针 test.c char arr[] = &quot;abcdef&...
  • C语言的指针和数组

    千次阅读 2006-10-09 17:24:00
    1.指针数组:一个数组里存放的都是同一个类型的指针,通常我们把他叫做指针数组。int * a[10];它里边放了10个int * 型变量,由于它是一个数组,已经在栈区分配了10个(int * )的空间,也就是32位机上是40个...
  • C语言中指针和数组的几种访问形式

    千次阅读 2016-08-29 21:07:32
    一、关于这几种访问形式,理论不多说,从例子看: 1、数组名 #include int main() { int i,a[]={0,1,2,3,4}; for(i=0;i;i++) ... printf("%d",a[i]);...//通过数组名的指针形式访问 } } 2、指针变量名 #include
  • 先上代码吧: #include #include using namespace std ; int replacefun(char* str, char c1, char c2);... char * p = "I love you China, do you love me?... // 用指针的形式定义一个字符数组 int m = 0; m
  • 第一题:#include &lt;stdio.h&gt; #include &lt;windows.h&gt; #pragma warning (disable:4996) int main() { int a[5] = { 1, 2, 3,... //数组名在&amp;或sizeof()一起使用时代表整个数组...
  • C语言学习之指针和数组

    千次阅读 2012-05-06 00:28:20
    1. 一维数组和指针 前面我们操作数组都是通过数组名加下标的方式,那么这个数组名到底代表什么含义?其实数组名它是一个指针常量,它是一个地址,这个地址是数组的首地址,也就是数组第一个元素的地址。例如: int a...
  • 理解 指针数组 数组指针 函数指针 函数指针数组 指向函数指针数组的指针
  • 数组指针和指针数组

    万次阅读 多人点赞 2019-09-17 16:39:06
    首先,理解一下数组指针和指针数组这两个名词: “数组指针”指针数组”,只要在名词中间加上“的”字,就知道中心了—— 数组的指针:是一个指针,什么样的指针呢?指向数组的指针。 指针的数组:是一个数组...
  • C中的指针和数组

    千次阅读 2013-11-10 21:41:36
    读《C语言深度解剖》感。...指针形式下标形式。访问过程都是先取指针所存地址值再在地址值上面通过运算得到目标地址,依据目标地址再得到内容。指针+1操作表示指向下一个指针变量所指类型的元素。   (1)
  • 数组和指针的区别令人困惑,很多人常常把数组名和指针看作是相同的——毕竟它们都是个地址。而且好像都可以进行算数操作、利用下标运算符运算。 例如如下代码,当把a的地址拷贝给p后,可以像把p当作a的引用一样使用...
  • 指针数组、数组指针——用指针访问数组方法总结

    万次阅读 多人点赞 2019-01-14 09:51:11
    2.2.2 指向每一行的指针(指针数组方式) 2.2.3 指向整个数组的指针(数组指针方式) 3 总结 1.数组元素的访问 数组中的各元素在内存中是连续分布的,要想访问数组中某一元素,那么就必须知道其地址。 在一....
  • C语言编程新手常听到的说法之一就是“数组和指针是相同的”。不幸的是,这是一种非常危险的说法,并不完全正确。 一、什么是声明,什么是定义。 注意下面声明的区别: extern int *x;//声明x是一个int类型的指针;...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 839,615
精华内容 335,846
关键字:

指针和数组