作为函数的定义的形式参数时,数组的下标表达式总是可以改写为带偏移量的指针表达式
#include
#define CHECK(a) check(#a, a) //#a 就是就是预处理时将 a 的内容变成字符串。
// CHECK(&(pa[1])) 预处理后成为 check("&(pa[1])",
// &(pa[1]))。因我懒得敲重复代码。呵呵!!
char* check(char* name, char* p) {
printf("checking %s --> %p\n", name, p);
return p;
}
void func(char ca[]) { printf("%p %p %p\n", &ca, &(ca[0]), &(ca[1])); }
void func2(char* pa) { printf("%p %p %p %p\n", &pa, &(pa[0]), &(pa[1]), ++pa); }
char abc[3] = {'A', 'B', 'C'};
int main() {
func(abc);
func2(abc);
return 0;
}
输出的结果为:
0x7ffff3a1d408 0x7f7497601010 0x7f7497601011
checking ++pa --> 0x7f7497601011
checking &(pa[1]) --> 0x7f7497601012
checking &(pa[0]) --> 0x7f7497601011
0x7ffff3a1d3f8 0x7f7497601011 0x7f7497601012 0x7f7497601011
这里需要说明的是printf函数打印参数的顺序是什么
是从右到左的顺序
即上面的代码是先打印出++pa,pa[1],pa[0]。
可以从以下代码看出
#include
int main()
{
int a = 1, b = 2, c = 3;
printf("(a + b + c)的值是%d, b的值是%d, c的值是%d\n", a+b+c, b++ , c++ );
return 0;
}
结果是:8,2,3.
数组参数的地址和数组参数的第一个元素的地址不一样**
#include
void func(char *ca,int n);
int main()
{
char ca[] = {1,2,3,4,5,6};
func(ca+(-1),6);
return 0;
}
void func(char *ca,int n){
int i;
for(i = 1;i<=n;i++){
printf("%d ", ca[i]);
}
}
可以输出1 2 3 4 5 6
只有字符串常量才可以初始化指针数组。
char *vegetable[] = {"carrot",
"celery",
"corn",
"cilantro",
"pataoes"};
或者是利用创建几个单独的数组,然后用这些数组名来初始化原先的数组
int row_1[] = {1,2,3,4,5,-1};
int row_2[] = {1,2,3-1};
int row_3[] = {6,7,8,9,-1};
int *weight[] = {row_1,row_2,row_3};