C指针编程之道(一)- 指针与数组

KinglyJn      2013-03-20

数组的下标表示法和指针表示法

# include <stdio.h>

int main() {
    char title[] = {"C language pointer!"}; //等价于char title[]="C language pointer!";
    char *ptitle;
    
    /*
     这段程序很清楚地表达了数组指针变量指向数组的概念。
     数组在内存中是一段连续的内存区域,数组名是数组第一个元素的地址,也就是这段连续内存区域的首地址。
     当数组指针变量指向数组时,实际上是指向第一个数组元素,也就是这段连续内存区域的首地址。
     */
    ptitle = title; //等价于ptitle=&title[0];
    printf("title: %s\n", title); //title: C language pointer!
    printf("ptitle->title: %s\n", ptitle); //ptitle->title: C language pointer!
    printf("&title=%p\n", &title); //&title=0x7fff5fbff790
    printf("ptitle=%p\n", ptitle); //ptitle=0x7fff5fbff790
    printf("&title[0]=%p\n", &title[0]); //&title[0]=0x7fff5fbff790
    
    //遍历
    while (*ptitle) {
        printf("%c", *ptitle);
        ptitle++;
    }
    printf("\n");
    
    int a[] = {1,2,3,4,5};
    int *p =a;
    while (*p) {
        printf("%d", *p);
        p++;
    }
    printf("\n");
    
    
    //另一种遍历
    p = a;
    for (int i=0; i<sizeof(a)/sizeof(int); i++) {
        printf("%d", p[i]); //等价于*(p+i)
    }
    printf("\n");
    
    return 0;
}


指针数组

/**
* int: 表示该指针数组的元素(即指针变量)指向int类型的数据
* *num: 表示该数组是指针数组,名字为num
* [3]: 数组的长度为3
*/
int *num[3]

/**
* char: 表示该指针数组的元素(即指针变量)指向字符或字符串的首地址
* *name: 表示该数组是指针数组,名字为name
* []: 数组的长度初始化成为了3
*/
char *name[] = {"China", "Beijing", "Haidian"};
//name[0] 指向 "China" 的首地址,同理 name[1],name[2]...


字符串与字符[串]指针变量

  • 在编程中,字符串是经常用到的操作对象;
  • 字符串的处理方式有两种,一种是数组形式,一种是指针形式;
  • 数组形式是吧字符串存放在数组当中,具有数组的属性,数组名代表存放字符串的首地址,可以通过下标或指针的方式访问字符串;
  • 指针形式是指通过字符指针指向字符串,以此来访问字符串中的字符,而不用定义数组;
  • 无论是数组或指针形式,字符串在内存中都是占用一块连续的内存空间。
# include <stdio.h>

int main() {
    char *str = "I love China!"; //str是一个指向char的指针变量,指向该字符串的首字符'I'的地址
    
    printf("%s\n", str); //I love China!
    printf("%p\n", str); //0x100000f9e
    
    /*
     运行结果:
     I 0x100000f92
       0x100000f93
     l 0x100000f94
     o 0x100000f95
     v 0x100000f96
     e 0x100000f97
       0x100000f98
     C 0x100000f99
     h 0x100000f9a
     i 0x100000f9b
     n 0x100000f9c
     a 0x100000f9d
     ! 0x100000f9e
     */
    char *p = str;
    while (*p) {
        printf("%c %p\n", *p, p);
        p++;
    }
    printf("\n");
    
    return 0;
}

Tags:


Share: