指针和数组
指针对于数组特别有用。
当定义各一个数组时, 系统会在内存中为该数组分配一个存储空间, 其数组的名称就是数组在内存中的首地址.若再定义各一个指针变量,并将数组的首地址传给指针变量,则该指针就指向了这个一维数组.
例如:
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