数组指针和指针数组的区别

  • A+
所属分类:体育平台

数组指针和指针数组的区别

在讲到指针数组与数组指针之前我们先来简单将一维数组的使用讲一讲,这样有利于我们更好的理解指针数组与数组指针。

一维数组

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>

int main()
{
	int a[8] = { 1,2,3,4,5,6,7,8 };//4个元素
    //sizeof()测变量所占空间的大小 (变量所对应类型空间) 

    //int b[];//err  定义时必须初始化
    int a1[100] = { 1,2,3,4 };//只初始化前4个 其余为0

    int n = 0;
    //sizeof(a) = 4 * 8 = 32;  数组类型由 元素个数 和 元素类型 决定
    n = sizeof(a) / sizeof(a[0]);

    for (int i = 0; i < n; i++)
    {
        //*(a+i) : a+i 代表 a中的的第i个元素  *(a+i)取值第a+i个元素
        printf("%d ",a[i]);
    }
    printf("n");

    //数组类型
    //a 代表首元素地址
    //&a 代表整个数组首的地址 它与首元素地址相同,但步长不同
    printf("a:%d,a+1:%dn", a, a + 1);//差4字节
    printf("&a:%d,&a+1:%dn", &a, &a + 1);//差32个字节

    //数组类型:由元素个数 和元素类型对应 int [8]
    //通过typedef定义一个数组类型
    //有typedef是类型,没有是变量
    typedef int A[8];//表示是一个数组类型

    A b;//int b[8] 等价  
    for (int i = 0; i < 8; i++)
    {
        b[i] = 2*i + 1;
    }
    for (int i = 0; i < n; i++)
    {
        printf("%d ", *(b + i));
        //printf("%d ", b[i]);
    }
    printf("n");
    printf("b:%d,b+1:%dn",b, b + 1);//差4
    printf("&b:%d,&b+1:%dn",&b, &b + 1);//差32
    return 0;
}

打印结果:

1 2 3 4 5 6 7 8
a:17823680,a+1:17823684
&a:17823680,&a+1:17823712
1 3 5 7 9 11 13 15
b:17823208,b+1:17823212
&b:17823208,&b+1:17823240

指针数组

指针数组的本质是一个数组,但这个数组的每个元素都是指针。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
  
  //agec代表:传参的个数(包括可执行程序)
//argv代表:指针数组,指向输入的参数
int main0401(int argc,char*argv[])
{
    char* a[] = { "aaa","bbb","ccc" };
    //这是一个指针数组,数组a中的每个元素都是指针类型
    printf("argc=%d", argc);
    for (int i = 0; i < argc; i++)
    {
        printf("%sn", argv[i]);
    }
      return 0;
}

数组指针

数组指针,它是一个指针,但它指向整个数组的首元素

int main()
{
    //数组指针,指向一维数组的整个数组,而不是首元素地址
    //定义数组指针变量
    int a[10] = { 0 };
    //1.先定义数组类型,再定义指针
    typedef int A[10];//A是数组类型  [10]代表步长
    A* p = NULL;//p是数组指针类型变量
    //p = a;//a代表首元素地址  a与&a值相同 最终系统会当做&a处理
    p = &a;//&a代表整个数组的首地址

    printf("p:%d,p+1:%dn", p,p + 1);//相差40

    for (int i = 0; i < 10; i++)
    {
        //a[]
        //p=&a;
		//*p = *&a->a;
        (*p)[i] = i + 1;
    }
    return 0;
}

打印结果:p:12319052,p+1:12319092

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: