【指针篇】C语言:指针与数组的区别,数组指针与指针数组的剖析。

原创 2016年05月30日 17:15:56

    指针就是指针,指针变量在 32位系统下,永远占 4  byte ,其值为某一个内存的地址。指针可以指向任何地方,但是不是任何地方你都能通过这个指针变量访问到。


    数组就是数组,其大小与元素的类型和个数有关。定义数组时必须指定其元素的类型和个数。数组可以存任何类型的数据,但不能存函数。

 

    说起指针,就让我们想到数组。而数组和指针也是有区别的。指针,指的是描述一个变量的地址;我们可通过指针的偏移来指向下一个地址。数组,是描述相同元素的一个集合;数组名是常量地址,不可自加不可修改。

 

     我们可以通过数组的下标访问或指针指针阶引用输出常量字符串。如:p[i]  *p+i)。

#include<stdio.h>
int main()
{
    int a[5] = { 1, 2, 3, 4, 5 };
    int *ptr = (int *)(&a + 1);
    printf("%d,%d", *(a + 1), *(ptr - 1));
    system("pause");
    return 0;
}

    分析:

    *(a+1)相当于a[0+1]=a[1]=2


    &a不降级,指的是整个数组,ptr是整个数组再加上1,则指的是a[4]紧接着后面的1个地址。再减去1,则指针又指回去并对其阶引用,相当于a[4],a[4]=5。


#include<stdio.h>
int main()
{
    int a[4] = { 1, 2, 3, 4 };
    int *ptr1 = (int *)(&a + 1);
    int *ptr2 = (int *)((int)a + 1);
    printf("%x,%x", ptr1[-1], *ptr2);
    system("pause");
    return 0;
}

     分析:

    &a不降级,是整个整型数组,+1,是整型数组4后的int大小的地址,ptr[-1]则通过下标方式对刚才的地址减去1后的地址,是4。


    a代表数组首元素的地址,将它强制类型转换为int型,表示的是首元素的内容,为1,2

    

    我根据sizeof分析数组与指针,如:

#include<stdio.h>
int main()
{
    int a[] = { 1, 2, 3, 4 };
    printf("%d\n", sizeof(a));//16
    printf("%d\n", sizeof(a + 0));//4
    printf("%d\n", sizeof(*a));//4
    printf("%d\n", sizeof(a + 1));//4
    printf("%d\n", sizeof(a[1]));//4
    printf("%d\n", sizeof(&a));//4
    printf("%d\n", sizeof(&a + 1));//4
    printf("%d\n", sizeof(&a[0]));//4
    printf("%d\n", sizeof(&a[0] + 1));//4
    system("pause");
    int a[5];
    int *p = &a;//??
    int *q = a;//??
    system("pause");
    return 0;
}

  

     上面是通过数组的下标访问或指针指针阶引用输出常量字符串。


     也许大家这时候会想,为什么只能是常量字符串呢,int型数组我就不可以了吗?这时候我们可以通过一个循环和指针阶引用去输出。

 

    下面我将数组和指针就以下几点详细地区分(常考于笔试面试简答题中):

 

1指针常用于存放变化性的变量,而数组常常用于存放一种类型的不经常变动的数据。

 

2指针变量自身是,指针存放的是数据的地址,而指针变量本身的地址我们无从而知。而数组名代表的事我们常说的数组首元素的地址,而并非是数组的地址。要说是数组的地址的话,那我们就要对其数组名取地址了(不降级)。

 

3访问数据方式:指针常常是间接访问,我们先找到对应的地址,再通过阶引用或数组下标方式访问到数组。而数组可直接通过下标去寻找,即直接访问。

 

     数组指针与指针数,如int *p[10],[]优先级高于*,表示的是数组中的每个元素都是int*类型的。用画图表示的话,它是10int型大小,每个int型中存放的是int*。而int*q[10]表示的是数组指针,归根结底,不管是什么指针,它都是指针,那么它就存放的是地址,只不过数组指针存放的是数组的指针。用画图表示的话,是地址,则是4个字节大小。这个指针指向了10int型大小的数组。

    接着,我想从传参和接收参数的角度分析数组和指针。

    将一个一维数组、 一级指针传参时,可通过对实参做一份拷贝并传递给被调用的函数,无法把指针变量本身传递给一个函数:

my_printarr1len) 

void my_print(int arr[],int len)或者

void my_print(int *arr,int len)

    二维数组

数组首元素传过去,用数组接收。

void my_print(int  arr[][4],int len)

数组的列不能省略。

     一级指针:

  即对p2做一份拷贝,假设其拷贝名为_p2。那传递到函数内部的就是_p2 而并非p2本身。

    二级指针:

int arr*[4];

test(arr);//数组指针的每一个元素都是的首元素传参

int test(int **q)//而数组指针存的是地址,需要用二级指针来存放地址的地址。




相关文章推荐

c语言中 数组名和指针的区别

  • 2012年10月02日 09:58
  • 97KB
  • 下载

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

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

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

在C语言的代码中,经常会将数组的数组名当做指针来使用。通过地址的偏移来对数组的元素进行操作。 此时,认为数组名和指针是等同的。 但是数组与指针到底是什么关系?将指针和数组划等号,会不会有什...

c语言核心整理之指针与数组的区别

本文主要是自己整理的对指针与数组从多个方面进行区别的内容,方便自己对数组与指针进行区别。...

转载加自己的见解 之从编译器角度分析C语言中数组名和指针的区别

数组名和指针是两个往往很容易让人们混淆的概念,很多人以为数组名就是一个指针,也有很多人知道数组名不同于指针但是仅知道数组名的值不能像指针一样改变,例如你可以写出下面这样的代码: [cpp...
  • dt28707
  • dt28707
  • 2012年10月06日 17:43
  • 1007

c语言中字符指针与字符数组的区别

char *str = "This is a string.";  是对字符指针进行初始化。此时,字符指针指向的是一个字符串常量的首地址,即指向字符串的首地址。  这里要注意字符指针与字符数组之间...

C语言——指针与数组区别

数组与指针的讨论数组定义并不等同于指针的外部声明!声明?定义?定义 只能出现在一个地方 确定对象的类型并分配内存,用于创建心得对象,如:int my_array[100]; 声明 可以多次出现...

从编译器角度分析C语言中数组名和指针的区别

数组名和指针是两个往往很容易让人们混淆的概念,很多人以为数组名就是一个指针,也有很多人知道数组名不同于指针但是仅知道数组名的值不能像指针一样改变,例如你可以写出下面这样的代码: int ...

C语言指针与数组的区别(1) extern

近日阅读c专家编程,对c语言中的指针数组的区别有了新的认识。 先看一段代码: //des.c int a[] = {3,2}; void hello(){    printf("d.c %...
  • rommel1
  • rommel1
  • 2012年04月11日 01:20
  • 1592

c语言中字符串常见初始化时的问题,以及字符串数组与指针区别的分析

1, 首先需要知道的是在头文件ctype.h中定义的各种字符函数在字符串中变得不再适用(把字符串拆成单个字符后其实还是适用的),并且赋值等在基本类型中使用的运算符也大都开始不适用,所以字符串有一套自己...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【指针篇】C语言:指针与数组的区别,数组指针与指针数组的剖析。
举报原因:
原因补充:

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