数组与指针

原创 2018年01月26日 15:04:07

总有人认为数组和指针是C语言里面最难的部分,其实认真思考发现数组和指针内容不多,只是我们经常把很多知识ran在一起,搞得自己很混乱。接下来我们细细看一看。
一、数组(数组:相同类型的元素的集合)
1、一维数组
(1)数组名及意义
1)数组名
看两个表达式的声明 int a; int b[5]; a是个变量名也是一个变量,b称为数组名,他是个指针常量,他的类型和数组元素类型相同,他的值是第一个元素的值。
数组名是个常量故此,不要试图去修改b的地址,因为数组的地址在程序链接是已经分配好了固定的地址,程序运行时已经无法修改。
数组名只有两种情况不被看做常量,sizeof(b)此时求得整个数组的整体长度(占用的总字节数)不能认为是求得指针常量的长度;&b此时求得整个数组的地址而不是指向某个常量的地址。
2)下标引用
b[2];他表示取得数组的第二个元素。过程描述:先对b指针加2(指针后移两个元素),再解引用(取出该地址处的内容)相当于*(b+2)。
下标访问过程和指针表达式访问过程相同,所以在任何时候你可以选择下表访问和指针访问(指针访问效率高)。
下面来几个栗子看看怎样转换:
下表访问和指针访问栗子
3)数组名作为函数参数
int b[10];
void fun(int *b),此时的b指针和原来的数组名b指针是不同的两个指针,此时的b是数组名b的一份拷贝。所以我们在函数内部试图对b进行修改并不会影响数组名b指针,但是我们可以通过解引用去访问数组,并去操控他。
举两个例子:
将src字符串拷贝到str中。

char *capacity(char *str) //给str开辟内存
{
    str = (char *)malloc(10*sizeof(int));
    if(NULL==str)
    {
        printf("扩容失败\n");
        return;
    }
    return str;
}
int main()
{
    char *str[]="abc";
    char *src[10]="asdfghkjh";
    capacity(str);
    for(i=0; i<10; i++)
    {
        str[i]=src[i];
    }
}

此题就是典型的数组名传参试图操纵形参来改变实参的问题,本题原意是去给数组str开辟内存,并将src的内容拷贝给str,内存的确开辟了但是完全和str没关系,下面进行拷贝字符串时程序崩溃。
再看下面的操作。

void strcpy(char *dst,char const*str)
{
    while(*str)
    {
        *dst++ == *str++;
    }
}

此时并没有去直接操作参数,而是去访问里面的内容。
这两个栗子同时也说明函数传参是把实参进行了一份临时拷贝。
声明数组参数:
int fun(int *str) & int fun(int str[]),你可以使用两种任意一种,我在博客你看到这种情况int fun(int *str[]),这个是错误的声明。
数组在进行传参还应该注意尽量不要传整个数组,而是用数组名(指针)作为实参传递,这样可以提高效率,节省内存。
4)数组的储存
数组元素在内存中从地址到高地址顺序存储。
数组存储
2、多维数组(可以看做是一维数组的各元素里面放着(n-1)维数组,简单的说就是一维数组里面放着数组)。
故多维数组的使用与一维数组相同。不同之处在于数组名传参,举个例子:
int arr[4][4];
fun(arr);他的原型可以是如下两种:
void fun(int arr[][]); 或者 void fun(int (*arr)[]);
切记不能是这样 void fun(int **arr);
3、指针数组
int *arr[5]; 这就是指针数组的定义。他和其他数组相同只是数组元素的类型变为了指针。
二、指针
谈到指针大家总会觉得很是琢磨不透,难。下面我们来慢慢了解。
1、指针是什么?
在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。
我们可以这样理解,先看个图
指针描述
对应代码:

#include <stdio.h>
int main()
{
int a = 10;//在内存中开辟一块空间
int *p = &a;//这里我们对变量a,取出它的地址,可以使用&操作符。
//将a的地址存放在p变量中,p就是一个之指针变量。
return 0;
}

总结:指针就是变量,用来存放地址的变量。(存放在指针中的值都被当成地址处
理)。
2、指针变量
像定义其他变量一样,比如int *a;char *c; float *c; 这些就是指针变量。(是不是还是很简单的)
3、指针的解引用
int *a;int *b; *a = 10;对变量a解引用就是对a所指向地址处的空间进行操作,此时就把a所指向的地址处存入了整数10。 *b = *a; 此时就是把b所指向的地址处存放了a所指向地址处的内容(此处存放整数10)。
4、指针的运算
指针可以进行算术加减运算和关系运算。
算术运算:
int a[5]={1,2,3,4,5};
int *b;
那你知道a+1;表示什么呢?上面数组问题谈到过,数组名在表达中代表指针,此时就是对指针加一。看下面图片
这里写图片描述
这里写图片描述
所以我们很清楚的看到,对指针加一,其实不是加一,而是加了该指针所对应的类型的字节数乘以1。减法运算与此相同(注意运算结果是不是你想要的结果,注意数组越界)。
关系运算:
关系运算就是可以对指针进行 比较大小 例如:

int *a,*b;
*a=1; *b=2;
if(a>b)
    printf("hehe");
else
    printf("haha"); 

可以进行 >,<,==,>=,<= 这些运算。
5、指针数组
指针数组和其他数组一样,只是数组里面存放的元素变为了指针。看下面图片
指针数组
很清楚的看到指针数组的数组元素都是指针,此时指针指向字符串第一个字符对应的地址。
6、数组指针
数组指针,顾名思义他是个指针,他指向某个数组。
int a[4][5];
int (*p)[5]=a;
这里a是个二维数组的数组名,相当于一个二级指针常量;p是一个指针变量,它指向包含5个int元素的一维数组。看下面的 图片你会更清楚理解。
数组指针
三、数组和指针之间的关系
数组可以用指针访问,数组里面可以存放指针,数组可以作为指针的指向对象;指针可以访问数组,指针可以存放数组的地址。
有人说数组和指针之间有着千丝万缕的关系,有人说数组和指针没关系。那么你认为呢?

**如果你经常搞混指针和数组,以及掌握的不牢固,建议多写程序去调试,看内存变化,如果你能看懂汇编代码,你不妨转到汇编去看看(可能会豁然开朗)。**
版权声明:本文为博主原创文章,转载请私信博主。

C语言中指针与数组的区别与联系

好久不写东西了,从毕业以来,整个人都懒散了很多。今天终于鼓起勇气,来写一点儿东西…… 指针与数组对于C语言程序员来说肯定不会陌生,一说起这个话题,我就想起了曾经被内存、地址、地址里的内容这些概念狂虐时...
  • cyfcsd
  • cyfcsd
  • 2017年02月03日 17:29
  • 4407

数组与指针关系

1
  • App_12062011
  • App_12062011
  • 2013年09月15日 20:25
  • 3333

C中数组与指针

     在这里随便定义一个数组     int arr[5];     arr现在就是数组名, arr 代表的是该数组整块内存,即sizeof(arr) == 20 (假设sizeof(int) =...
  • hui_love2046
  • hui_love2046
  • 2010年07月19日 20:10
  • 18920

C语言指针与数组易混淆知识点(一)

一指针与数组 二指针与函数 三指针数组数组指针指向指针的指针 四程序陷阱 一、指针与数组指针:指针本身也是一个变量,它的内容是指向的内容的地址。指针同样有类型的区分,char 的指针只能指向char型...
  • woshimalingyi
  • woshimalingyi
  • 2016年03月25日 15:59
  • 2994

探讨下C++中的数组和指针的区别

最近一段时间在研究虚拟现实方面的内容,有一段时间没写代码,重拾C++,顺便记录下C++中容易出错的内容,数组和指针的区别。很多新手都抱怨说C++难,尤其是指针和数组,傻傻分不清楚,那么我就从我对数组和...
  • transferli
  • transferli
  • 2016年03月24日 13:04
  • 308

C语言:数组和指针的区别

实际上关于数组与指针的区别这个问题在《C专家编程》已经有很详细的阐释,但我想用自己的语言说一说我的理解。数组是指针?最近在做数据结构课设,其中一个函数发生了令人费解的错误,简化后的代码如下:#incl...
  • imred
  • imred
  • 2015年05月02日 19:08
  • 13920

C/C++数组和指针详解

/****************************************************************/ /*            学习是合作和分享式的! /* Au...
  • wdzxl198
  • wdzxl198
  • 2013年06月13日 16:16
  • 7065

数组和指针的联系

1.数组的本质是一段连续的内存空间2.数组的空间大小为sizeof(array_type)*array_size3.数组名可看做指向数组第一个元素的常量指针4.指针是一种特殊的变量,与整数的运算规则为...
  • qq_31208451
  • qq_31208451
  • 2017年08月20日 17:15
  • 129

【C++】有关c++中数组与指针的关系

下图是代码与运行结果: 1.简单数组与指针的关系(int型数组为例): 解释: 第二句相当于int型指针cp指向了数组的第一个元素,所以,打印出的cp是第一个元素的地址;&cp[0]与...
  • wendongxia
  • wendongxia
  • 2017年02月26日 15:39
  • 980

指针与数组的比较

C++/C 程序中,指针和数组在不少地方可以相互替换着用,让人产生一种错觉,以为两者是等价的。     数组要么在静态存储区被创建(如全局数组) ,要么在栈上被创建。数组名对应着(而不是指向)一块内存...
  • yanxiaolx
  • yanxiaolx
  • 2016年05月29日 13:43
  • 569
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数组与指针
举报原因:
原因补充:

(最多只允许输入30个字)