7.C语言-指针

2017-01-24  本文已影响0人  后备干部

1. 二维数组

* 把二维数组a分解为一维数组a[0],a[1],a[2]之后,设p为指向二维数组的指针变量。可定义为:
* int (*p)[4]
* 它表示p是一个指针变量,它指向包含4个元素的一维数组。若指向第一个一维数组a[0],其值等于a,a[0],或&a[0][0]等。
* 而p+i则指向一维数组a[i]。
* 从前面的分析可得出*(p+i)+j是二维数组i行j 列的元素的地址,而*(*(p+i)+j)则是i行j列元素的值。
* 二维数组指针变量说明的一般形式为:
* 类型说明符  (*指针变量名)[长度]
* 其中“类型说明符”为所指数组的数据类型。“*”表示其后的变量是指针类型。“长度”表示二维数组分解为多个一维数组时,一维数组的长度,也就是二维数组的列数。

2.字符指针变量和字符数组

* 虽然用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈……
* 主要概括起来有以下几点:
* 1. 字符数组由若干个元素组成,每个元素中  放一个字符,而字符指针变量中存放的是地址(字符串第1个字符的地址),决不是将字符串放到字符指针变量中。
* 2. 赋值方式。对字符数组只能对各个元素赋值,不能用以下办法对字符数组赋值。
     char  str[20];
     str=″I love Fishc.com!″;
  
  而对字符指针变量,可以采用下面方法赋值:
     char*a;
     a=″I love Fishc.com!″;
  但注意赋给a的不是字符,而是字符串第一个 元素的地址。
* 3. 对字符指针变量赋初值:
    char *a=″I love Fishc.com!″;
       等价于
      char*a;
    a=″I love Fishc.com!″;

    而对数组的初始化:
    char str[20]={″I love Fishc.com!″};
    不能等价于
    char str[20];
    str[ ]=″I love Fishc.com!″;
* 4. 如果定义了一个字符数组,在编译时为它分配内存单元,它有确定的地址。而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个字符变量的地址也就是说,该指针变量可以指向一个字符型数据,但如果未对它赋予一个地址值,则它并未具体指向一个确定的字符数据。  
* 我们举个例子来说明
* 如:   char str[10];
      scanf(″%s″,str);
           以上是完全可以的!
* 而常有人用下面的方法,目的是想输入一个字符串,虽然一般也能运行,但这种方法是危险的 :
             char*a;
      scanf(″%s″,a);

3. 有关指针的数据类型的小结

QQ20170125-1.png

4. void指针

* ANSI C新标准增加了一种“void”指针类型,即不指定它是指向哪一种类型数据的指针变量。
* 例如:void *p;
* 表示指针变量p不指向一个确定的类型数据,它的作用仅仅是用来存放一个地址。
* void指针它可以指向任何类型数据。也就是说,可以用任何类型的指针直接给void指针赋值。但是,如果需要将void指针的值赋给其他类型的指针,则需要进行强制类型转换。
上一篇下一篇

猜你喜欢

热点阅读