黑马程序员技术交流社区

标题: 指针下(很全面的总结) [打印本页]

作者: 562413895@qq.co    时间: 2015-7-21 08:54
标题: 指针下(很全面的总结)
5、数组和指针的关系
int *p;//定义一指针变量p
int a[n];//定义一个长度为n的一维数组a
则: a[i] 等价于 *(p+i);&a[i] 等价于  *(a+i)。
int *p;//定义一指针变量p
int a[m][n];//定义一个二维数组a
则:*(a[i]+j)等价于 *(*(a+i)+j)等价于 a[i][j];  a[i]+j 等价于 *(a+i)+j 等价于 &a[i][j]。
对二维数组来说:a、a+i、a[i]、*(a+i)、*(a+i)+j、a[i]+j都是地址,而 *(a[i]+j)和 *(*(a+i)+j)是二维数组元素 a[i][j] 的值。
对二维数组来说,对应的地址的关系如下:
a 表示二维数组名,指向一维数组 a[0],即0行首地址;
a [0],*(a+0),*a 表示0行0列元素地址;
a+1,&a[1] 表示1行首地址;
a[1],*(a+1)表示1行0元素a[1][0]的地址
a[1]+2,*(a+1)+2,&a[1][2]表示1行2列元素a[1][2]的地址
指向多维数组元素的指针变量,它包含:
    1)指向数组元素的指针变量
例:int *p;//定义一指针变量p
       int a[m][n];//定义一个二维数组a
       令p=a[0];//a[0]表示二维数组a[m][n]的0行0列元素的地址
        p++;//由上式知道p++表示指向二维数组a[m][n]下一个元素,即是下一个元素的地址
        则 *p 表示输出二维数组a[m][n]下一个元素的值,若每次p++,则可得到二维数组的每个元素
     2)指向由m个元素组成的一维数组的指针变量
例:int *p;//定义一指针变量p
       int a[m][n];//定义一个二维数组a
       令p=&a[0];//&a[0]表示二维数组a[m][n]的0行的首地址
        p++;//由上式知道p++表示指向二维数组a[m][n] 得1行的首地址,p的增值以一维数组的长度为单位
        则 *p 表示输出二维数组a[m][n]的a[1][0]值,即1行0列元素的值。
        若定义 int(*p)[n] ,其中p是一个指针变量,则表示p指向包含n个整型元素的一维数组,即p是指向一维数组的指针。
注意:指针变量的值可以改变,而数组名虽然代表数组的地址,但它是个常量,它的值不能被改变。
6、字符串与指针
在C语言中,可以用两种方式访问一个字符串
      1)用字符数组存放一个字符串,然后输出该字符串
            例:char str[]="Hello world!";//定义一个字符数组
                   printf("%s",str);//输出该字符串
      2)用字符指针指向一个字符串
例:char *str="Hello world!";//定义一个字符指针str,把字符串常量第一个元素的地址赋给str,用它指向字符串常量"Hello world!"
                   printf("%s",str);//输出该字符串,因为系统先输出指针变量str指向的一个字符数据,然后自动使str加1,使之指向下一个字符,然后输出,知道遇到字符串结束标志 '\0' 为止。注意在内存中,字符串的最后被自动加了一个 '\0',故在输出时能自动确定字符串的终止位置。
      说明:通过字符数组名或字符指针变量可以输出一个字符串。而对于一个数值型数组,是不能用数组名输出它的全部元素的。
字符指针作函数参数
       将一个字符串从一个函数传递到另一个函数,可以用地址传递的办法,及用字符数组名作参数,也可以用指向字符的指针变量作参数。
       字符指针可以作形参和实参。
字符指针变量和字符数组的关系
    1)字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第一个字符的地址)
    2)赋值方式。对字符数组只能对各个元素赋值,
         char str[]="Hello world!";//字符数组赋值方式,它可以在定义时整体赋初值,但不能在赋值语句中整体赋初值。如:str[]="Hello world!"这样赋初值是不行的。
         char *a;  a="Hello world!";//字符指针变量的赋值方式,a是字符串第一个元素的地址。
     3)对字符指针变量赋初值。
         char *a="Hello world!";等价于 char *a;  a="Hello world!";//字符指针变量可以在赋值语句中整体赋初值。
     4)若定义了一个字符数组,在编译时为它分配了内存单元,他有确定的地址,但是字符指针变量若未对它赋初值,则它将指向一个不确定的字符数据。
     5)指针变量的值可以改变,但是字符数组名不能改变。
          char *a="Hello world!"; a=a+7;
     6)用指针变量指向一个格式字符串,可以用它代替printf函数中的格式字符串。
           char *format="a=%d,b=%f\n";
           printf(format,a,b);
7、指针数组和指向指针的指针
1)指针数组:指的是对一个数组,若其元素均为指针类型数据,则称为指针数组。即指针数组中的每一个元素都相当于一个指针变量。
      一维指针数组: 类型名  * 数组名[数组长度]   
       如:int * p[5]={"Computer","Jun","Ying","Love","Ios"};//表示指针数组p有5个元素,起初值分别是"Computer"、"Jun"、"Ying"、"Love"和"Ios"的起始地址。
2)指向指针的指针:即指向指针数据的指针变量
      如:char *a[]={"Computer","Jun","Ying","Love","Ios"};//定义一个指针数组
             char **p;//定义了一个指向字符数据的指针变量
            int i;  p=a+i;//使 p 指向指针数组a的 i 号元素 a[i]
            printf("%s\n",*p);//则输出数组a的第(i+1)个字符串
3)指针数组作main函数的形参
      如:void main(int argc,char *argv[])
8、void指针类型
它指的是可以定义一个指针变量,但是不指定它是指向哪一种类型数据。
例:void *p1;//定义一个void型的指针变量p1
       char *p2;//定义一个char型的指针变量p1
       p1=( void *)p2;//用(void *)p2将p2的值转换成void * 类型。
       void * fun(char ch1,char ch2)//定义void * 类型的函数fun
      
作者: 562413895@qq.co    时间: 2015-7-21 08:56
总结的真的不错,给自己32个赞
作者: skywan    时间: 2015-7-21 09:22
这块确实应该好好看看,谢谢分享
作者: 慕名黑马生    时间: 2015-7-21 15:51
眼睛花了,先容我躺会儿
作者: zhangnan110    时间: 2015-7-21 19:00
赞一个,这篇要留着。
作者: 13817049701    时间: 2015-7-21 23:35
总结的很好,也相当有深度!要不是学过计算机组成原理,我想我早就晕了
作者: huguozhang    时间: 2015-7-22 00:35
顶一个~~~~~~~
作者: Northcity    时间: 2015-7-22 21:10
mark  比较全面
作者: zhaofeizlj    时间: 2015-7-22 21:14
很好!!!!!!!!!!!!!!!!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2