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

指针就是指针,指针变量在 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*类型的。用画图表示的话,它是10个int型大小,每个int型中存放的是int*。而int(*q)[10]表示的是数组指针,归根结底,不管是什么指针,它都是指针,那么它就存放的是地址,只不过数组指针存放的是数组的指针。用画图表示的话,是地址,则是4个字节大小。这个指针指向了10个int型大小的数组。

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

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

my_print(arr1,len)

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)//而数组指针存的是地址,需要用二级指针来存放地址的地址。

时间: 2024-10-16 18:43:36

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

菜鸟入门记录篇1--C语言中两种关于字符串表达的方法(数组和指针)

现需表示一个字符串“itcast”,表示方法如下所列: 方法1: char name[]="itcast";     //此时定义的是一个字符串变量,数组内包含了6个字母及‘\0’一共7个元素,储存在内存的栈里面,数组内部的字符可以随意改动: (注:内存的“栈”里面储存的是局部变量,值是可以随意更改的) name[0]='t'; printf(“%s\n”,name); 输出结果为:ttcast: 方法2: char *name="itcast";    //此时定

为什么说指针是 C 语言的精髓?

简单来说,因为C就那点破feature,如果你把指针干掉,那这语言就完了.相反,如果你干掉struct,干掉union,干 掉数组,甚至你把if-while都干掉,留下malloc和goto,则最多就是程序难写一点而已. 所以这就是为什么C语言的精髓是指针了,因为他只有指针可以用了. 把struct和数组都砍掉之后 只能用char*让后到处指针运算和强制转换了,因为没有了内存布局 没if怎么goto 把两个continuation的函数指针装进数组里面,算出个true和false,用下标拿出来,

指针和数组的区别

针的操作: 允许:1)同类型指针的赋值 2)与整形的加减运算 3)指向同一数组内指针的减运算和比较 4)赋 ‘0’ 或与 ‘0’ 比较 不允许:1)两指针的相加,相乘除,位移或mask 2)与float,double类型相加 3)不通过类型转换,直接赋予除void*之外的其它类型指针 指针与数组的相同点: 1,a[i]可以用*(a+i)表示 2, 当传递给函数作为实参时,则都是一个地址 指针和数组的区别: 1,数组是一块连续区域,要么是在静态存储区被创建(如全局数组),要么是在栈上被创建.数组名

深入理解C语言中的指针与数组之指针篇(转载)

前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本所在.相信,任意一家公司如果想要考察一个人对C语言的理解,指针和数组绝对是必考的一部分. 但是之前一方面之前一直在忙各种事情,一直没有时间静下心来写这些东西,毕竟这确实是一件非常耗费时间和精力的事情:一方面,个人对C语言的掌握和理解也还有限,怕写出来的东西会对大家造成误导.当然,今天写的这些东西也肯定存在各种问题,不严谨甚至错误的地方肯定有,也希望大家来共同探讨,相互改进. 我会慢慢的写完这几章,有想法的童鞋可以和我探讨

瘋子C语言笔记(指针篇)

指针篇 4.数组a 的性质 int a[3][4] = {{1,3,5,7},{9,11,13,15},{17,19,21,23}} int 型数据在KEIL编译环境下,占2字节内存 表示形式 含义 地址 a 二维数组名,指向一位数组a[0],即0行首地址 设2000 a[0].*(a+0).*a 0行0列元素地址 2000 a+1,&a[1] 1行0列元素地址 2008 a[1].*(a+1) 1行0列元素a[1][0]的地址 2008 a[1]+2.*(a+1)+2.&[1][2] 1

C语言 数组做函数参数退化为指针的技术推演

//数组做函数参数退化为指针的技术推演 #include<stdio.h> #include<stdlib.h> #include<string.h> //一维数组做函数参数退化为指针的技术推演 void printfA(char * strarr[3]); //计算机中,数组都是线性存储,二维数组元素也是一个个的排列的 //例如: 1,2,3,4,5,6,7,8,9 像这组数据 我们可以认为是一维数组 int a[9]={1,2,3,4,5,6,7,8,9}; //也

C语言指针数组(每个元素都是指针)

转载:http://c.biancheng.net/cpp/html/3246.html 注意:数组指针的区别 如果一个数组中的所有元素保存的都是指针,那么我们就称它为指针数组.指针数组的定义形式一般为: dataType *arrayName[length]; [ ]的优先级高于*,该定义形式应该理解为: dataType *(arrayName[length]); 括号里面说明arrayName是一个数组,包含了length个元素,括号外面说明每个元素的类型为dataType *. 除了每个

C语言:返回两个数组中第一个元素的指针,并输出这个值

// //  main.c //  Pointer_search // //  Created by ma c on 15/8/2. //  Copyright (c) 2015年 bjsxt. All rights reserved. //  要求:通过指针查找,实现比较两个有序数组中的元素,输出两个数组中的第一个相同的元素值. #include <stdio.h> int *searchSameElement(int *a,int *b,int len1,int len2); int ma

【C语言】用结构体数组指针完成:有三个学生信息,存放在结构体数组中,要求输出全部信息

//用结构体数组指针完成:有三个学生信息,存放在结构体数组中,要求输出全部信息 #include <stdio.h> struct Stu { int num; char name[20]; char sex; int age; }; int main() { struct Stu student[3]={{317,"han",'m',20},{318,"hun",'w',22},{311,"dan",'w',18}}; struct