学前疑问
数组的本质是一片连续的内内存,那么,数组的地址是什么?如何获取?
问:数组的起始地址,如何获取?
答:&去地址操作符。
一些规则
- 使用取地址操作符&获取数组的地址。
- 数组名可看作一个指针,代表数组中0元素的地址。
- 当指针指向数组元素时,可进行指针运算。
int a[] = {1, 2, 3, 4, 5};
int *p = a;
p = p + 1;
下面的程序输出什么?为什么?
#include <stdio.h>
int main(void)
{
int a[] = {1, 2, 3, 4, 0};
int *p = a;
p++;
*p = 100;
printf("%d, %d\n", *p, a[1]);
printf("%p, %p\n", &a, a); /* 数组的地址和0号元素的地址是一样的 */
return 0;
}
数组名和数组指针
&a和a在数值上相同,但是意义是不同
&a代表数组地址,类型为:int()[5] = &a;
a代表数组0好元素的地址,类型为int;
指向数组的指针:int (*pName)[5] = &a;
int main(void)
{
int a[] = {1, 2, 3, 4, 0};
int (*p)[5] = &a; //数组指针,指向数组a
int *pa = a; //int类型的指针,指向数组a的首地址
printf("pa = %p, p = %p", pa, p);
pa = p; //类型不一致,会报警告
while (*p)
{
printf("%d ", *p); //将p指向元素的值出来 => 将数组的值打印出来
p++;
}
return 0;
}
注意:数组名不是指针,只是代表了0号元素的地址。
问答
问:C语言中的字符串常量是什么类型?
答:char *类型,一种指针类型。
#include <stdio.h>
int main(void)
{
printf("%p", "Liu ren xian shi\n"); //打印字符串的地址
printf("%p", "Liu ren xian shi\n"); //打印字符串的地址
return 0;
}