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

对数组的定义:数组是一个固定长度的存储相同数据类型的数据结构,数组中的元素被存储在一段连续的内存空间中。

格式:

一维数组:数据类型 数组名[数字(包含了几个元素)]={元素,元素,元素,元素....}

int             ar    [    7    ]    =    {0,1,2,3,4,5,6,7}
 ↑               ↑         ↑                        ↑
数组类型       数组名    元素数量                  元素

二维数组:数组类型        数组名[行数][列数]=[{},{},{}.....]

    int     ar    [2][3]    =    {{0,1,2},{10,11,12}};
     ↑       ↑     ↑  ↑                    ↑
 数组类型  数组名   排 列                 元素

指针的定义:值为内存地址的变量。通常用于指向同类变量的地址。

格式:

指针类型 *指针名;

    int         *b;
     ↑           ↑
  指针类型   指针变量名

 指针运算的使用

取地址运算符&:单目运算符&是用来取操作对象的地址。例:&i 为取变量 i 的地址。对于常量表达式、寄存器变量不能取地址(因为它们存储在存储器中,没有地址)。
指针运算符*(间接寻址符):与&为逆运算,作用是通过操作对象的地址,获取存储的内容。例:x = &i,x 为 i 的地址,*x 则为通过 i 的地址,获取 i 的内容。

//声明了一个普通变量 a
int a;
//声明一个指针变量,指向变量 a 的地址
int *pa;
//通过取地址符&,获取 a 的地址,赋值给指针变量
pa = &a;
//通过间接寻址符,获取指针指向的内容
printf("%d", *pa);
#include<stdio.h>
int main()
{
	int a=20,b=10;
	int *x,*y;
	x=&a;
	y=&b;
	printf("占用空间为%d,地址为%#p\n",sizeof(a),&a);
	printf("占用空间为%d,地址为%#p\n",sizeof(b),&b);
	printf("a=%d,b=%d\n",*x,*y);
	printf("a的地址为%#p,b的地址为%#p",x,y);
	return 0;
}

输出结果为

 其中x=&a,y=&b起到了将a,b的地址分别赋给x,y,同时也将a,b的值赋给了*x,*y。

打个比方:

去酒店订了两个房间a,b,门牌号暂时用 x、y 表示
让 10 住进 x,让 20 住进 y
其中门牌号就是 x、y 就是变量的地址
a 和 b 在这里可以理解为具体的房间,房间 a 的门牌号(地址)是 x,房间 b 的门牌号(地址)是 y。而 20 和 10,通过x、y 两个门牌,找到房间,住进 a、b。

 由于计算机的硬件指令依赖地址,指针把程序员想要表达的指令以机器的形式表达。因此使用指针的程序更有效率,尤其是处理数组时。

指针数组

定义:是指一个数组里面装着指针,也即指针数组是一个数组,内含指针

int *a[10];    //指针数组的定义形式;

使用 


#include <stdio.h>
int main(){
    int a = 16, b = 932, c = 100;
    //定义一个指针数组
    int *arr[3] = {&a, &b, &c};//存放a,b,c的地址
    //parr 是指向数组 arr 的指针,确切地说是指向 arr 第 0 个元素的指针,
    //它的定义形式应该理解为int *(*parr),括号中的*表示 parr 是一个指针,括号外面的int *表示 parr 指向的数据的类型。
    //arr 第 0 个元素的类型为 int *,所以在定义 parr 时要加两个 *。
    int **parr = arr;
    printf("%d, %d, %d\n", *arr[0], *arr[1], *arr[2]);//16, 932, 100
    printf("%d, %d, %d\n", **(parr+0), **(parr+1), **(parr+2));//16, 932, 100
 
    return 0;
}

数组指针

定义:是指一个指向数组的指针,它其实还是一个指针,指向数组的指针

int (*p)[10];     //其中,由于[]的优先级高于*,所以必须添加(*p).

使用

一维数组

int main()
{
    char a[5]={'A','K','C','G','L'};    
    char (*p)[5]=&a;//&a代表的是整个数组的首地址
    //char (*p)[5]=a;这样是错误的,因为a代表第一个元素的首地址
    printf("%c %c %c",**p,*(*p+1),*(*p+3));//输出:A K G
    return 0;
}

二维数组 


#include <stdio.h>
int main()
{
    int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };
    int(*p)[4];//p指向数组 a 的开头,也即第 0 行;p+1前进一行,指向第 1 行。
    int i,j;
    p=a;
    for(i=0; i<3; i++)
    {
        for(j=0; j<4; j++) 
            printf("%d  ",*(*(p+i)+j));//*(*(p+i)+j)表示第 i 行第 j 个元素的值。
        printf("\n");
    }
    /*
         0   1   2   3
         4   5   6   7
         8   9  10  11
    */
 
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值