【编程语言 · C语言 · 指针和数组】

指针和数组

指针对于数组特别有用。

当定义各一个数组时, 系统会在内存中为该数组分配一个存储空间, 其数组的名称就是数组在内存中的首地址.若再定义各一个指针变量,并将数组的首地址传给指针变量,则该指针就指向了这个一维数组.

例如:

int *p, a[5];
p=a;

这里a是数组名, 也就是数组的首地址, 将它赋给指针变量p, 也就是将数组a的首地址赋给p.

也可以写成如下形式:

int *p, a[5];
p = &a[0];

使用指针,我们可以指向第一个元素,然后使用地址算法遍历数组: +用于向前移动到存储位置 -用于向后移动到存储位置

int a[5] = {22, 33, 44, 55, 66};
int *ptr = NULL;
int i;

ptr = a;
for (i = 0; i < 5; i++) {
  printf("%d ", *(ptr + i));
}

程序输出为:22 33 44 55 66

数组的一个重要概念是,数组名称充当指向数组第一个元素的指针。

因此,语句 ptr = a 可以认为是 ptr =&a[0]。

【填空题】以下代码的输出是什么?

int a[5] = {22, 33, 44, 55, 66};
int *ptr = a;
int res = *(ptr + 2);
printf("%d", res);

更多地址算法

地址运算也可以视为指针运算,因为操作涉及指针。

除了使用+和–来引用下一个和上一个存储器位置之外,还可以使用赋值运算符更改指针包含的地址。

例如:

int a[5] = {22, 33, 44, 55, 66};
int *ptr = NULL;

ptr = a;  /* point to the first array element */
printf("%d  %x\n", *ptr, ptr);  /* 22 */
ptr++;
printf("%d  %x\n", *ptr, ptr);  /* 33 */
ptr += 3;
printf("%d  %x\n", *ptr, ptr);  /* 66 */
ptr--;
printf("%d  %x\n", *ptr, ptr);  /* 55 */
ptr -= 2;
printf("%d  %x\n", *ptr, ptr);  /* 33 */ 

程序输出类似于:

22 febd4760
33 febd4764
66 febd4770
55 febd476c
33 febd4764 

你也可以使用 ==,< 和 > 运算符比较指针地址。

【选词填空】使用自增运算符增加指针并输出存储的值:

int arr[] = {1, 2, 3};
int* ptr = arr;
ptr;
printf("%d", );

&ptr

++

*ptr

ptr

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟程序员__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值