learn-C-09

char input[81];    //holds a string as long as 80 characters 
char *iptr=input;  //also could have done this: char *iptr=&input[0];
gets(iptr);       //makes sure that iptr points to the string typed by the user.

指针

内存地址

  • 内存地址,从0开始,并逐渐增加
  • 每个地址就是不同的下标,每个内存位置就是不同的数组元素

定义指针变量

  • 定义指针变量,要理解以下 指针运算符

int *pNum;     // 指针变量名可随意定义。许多程序员喜欢以p(pointer,指针)开头
float *pValue;
  • 指针变量存放了其他变量的地址。这是指针的主要用途
  • 用取址运算符&,把一个变量的地址赋给一个指针。且指针未被初始化,不能用它们做任何事。

    int age=19; int *pAge=&age; //定义整型变量age,并存储19。再定义指针变量pAge,并使它指向age.

  • 在指针定义时,用*表示这个变量是一个指针
  • 在把一个变量的地址赋给指针变量时不用*,除非在同时定义这个指针。

  • 当把一个指针指向另一个变量后,可通过对指针取值来处理另一个值,用*取值运算符。

  • 如上2条语句,有两种修改age值的方法:

    age=25; *pAge=25;

  • 打印age值的两种方法:

    printf("the age is %d.\n", age);
    

    printf("the age is %d.\n", *pAge;

数组和指针

  • 数组是特殊类型的指针
  • 可用指针符号(*)来获取数组的值,也可用数组符号([])来访问指针指向的值

数组名是指针

  • 数组名是指向第一个数组元素的指针。是指针常量。
  • 如: int vals[5]={10,20,30,40,50};
  • 当你定义并初始化vals时,C语言设置一个指向数组的指针并命名为vals。

  • 如打印数组的第一个值:

在数组中取值

字符和指针

  • 两条语句在内存中设置了几乎相同的内容。
  • 唯一不同的是:第2条语句是指针变量。

指针数组

一个包含25个整型指针的数组;一个包含25个字符型指针的数组

字符数组,在数组中存储字符串的列表。即指向不同的字符串。如下程序:

int main(){
    int i;
    char *names[5]={"Joe Swadley", "Richard Wikert", "Keith Miller", "Dean Davenport", "Stacy Wiquet"};

    for(i=0;i<5;i++) {
        printf("Name %d: %s\n", i, names[i]);
    }
return 0;
}

每一个元素只不过是一个字符型指针,包含了不同人名的地址。names不存放字符串,它只存放指向字符串的指针。

把字符型指针存储在nemes中就可以使程序表现得像names是一个字符串数组一样。