c专家编程学习笔记

c专家编程学习笔记

第九章 再论数组

9.1什么时候数组和指针相同

这一章主要是论述数组和指针之间可以相互替换的情况
c专家编程学习笔记_第1张图片

9.2为什么会发生混淆

作为函数的定义的形式参数时,数组的下标表达式总是可以改写为带偏移量的指针表达式

9.2.1 表达式中的数组名就是指针

9.2.2 C语言把数组下标作为指针的偏移量

9.2.3 作为函数参数的数组名等同于指针

207页的编程挑战

#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.
数组参数的地址和数组参数的第一个元素的地址不一样**

9.4数组片段的下标

#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

9.6 C语言的多维数组

只有字符串常量才可以初始化指针数组。

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};

你可能感兴趣的:(c专家编程学习笔记)