谭浩强C-指针

发布时间:2016-12-7 0:05:42 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"谭浩强C-指针",主要涉及到谭浩强C-指针方面的内容,对于谭浩强C-指针感兴趣的同学可以参考一下。

一、地址指针的基本概念 计算机中所有数据存放在存储器中,一般将一个字节称为一个内存单元。C语言中整型数据占两字节,即两个内存单元;字符型数据占一个内存单元。为准确访问内存单元,须给内存单元编号,这编号也称为地址。指针就是对地址的描述。数据或函数在内存中都是连续存放的,通过指针指向的首地址可以找到数据或函数。 二、变量的指针和指向变量的指针变量 1、变量的指针就是存放变量的存储单元的首地址。 2、C语言中可用一个变量来存放指针,这种变量称为指针变量。 3、指针变量的定义及运用: (1)定义: 类型说明符 *变量名;//类型说明符说明的是该指针变量指向内存单元存放的数据类型,字符*表示该变量是一个指针变量 (2)指针变量的运算 1)&:取地址运算符:对变量x取其地址:&x. 2)*:指针运算符:对指针变量x取出其指向内存段中的数据:*x.(须注意这里运算符*与指  针变量中说明符*的区别。 (3)指针变量初始化 1)定义中直接赋值: int a; int *p=&a; 2)单独赋值(不能把直接数、常量赋值给指针变量): int a; int *p; p=&a; 4、指针变量作为函数参数 如果指针变量作为函数的参数,则在调用时讲实际参数(实际指针变量的值)传给形式参数指针变量,但一般情况下,与一般的实际参数一样,在调用之后实际参数本身的值不发生变化,实际指针变量参数的值也不变化,即不改变实际指针变量的指向地址。因为调用函数时仅仅是实际参数向形式参数传递值而已,不影响本身。 5、指向其他数据类型的指针变量 (1)指向数组 int a[2],*pa; pa=a; //数组名表示数组的首地址 pa=&a[0]; //另外一种写法,因为数组第一个元素的地址即为数组首地址 (2)指向字符串 char *pc; pc="clanguage"; //将字符串"clanguage"首地址给pc (3)指向函数入口 int (*pf)() pf=f; //f为函数名称 ?疑问1: 对于指向数组的指针变量为何用int定义?按理解int *定义的指针变量指向的内存单元存放的是基本整型数据。如果这样定义,用(指针运算符*+指针变量)表示的究竟是整型数据还是数组呢? 疑问例1: 上例中pa指向数组b,*pa表示第一个数组元素;*(pa+1)表示第二个数组元素。 那么上面疑问1“如果这样定义,用(指针运算符*+指针变量)表示的究竟是整型数据还是数组呢?”则并不是问题了。因为指向数组的指针变量数据类型须与数组类型一致。 ?疑问2: 对于指向字符串指针变量为何赋初值直接写出整个字符串。另外,对于谭浩强书中例子: char *pc; pc="clanguage"; 如果对于字符串"clanguage"在定义指针变量之前未有定义该字符串会否程序出错?如果未定义,系统怎知忽然冒出的这个字符串的存储地址呢?或是在给pc赋初值的同时就先给字符串分配了存储空间? 上例显示程序终止,问题在哪里? 三、理解实例 1、输入a,b整数,按大小分别输出a和b。 void main() { int a,b,x,*pa,*pb,*p; printf("input 2 numbers:"); scanf("%d%d",&a,&b); pa=&a;pb=&b; //思考:这里能否用*pa=a;*pb=b;代替? if(a<b) {p=pa;pa=pb;pb=p;} //2、只是通过改变指针变量的指向 printf("a=%d,b=%d.\n",a,b);             //1、存放a和b的内存单元中的数值没有变 printf("max=%d,min=%d.\n\n\n",*pa,*pb); //如果要互换ab的值: printf("input 2 numbers:"); scanf("%d%d",&a,&b); if(a<b) {x=a;a=b;b=x;}                //方法一:直接通过中间变量转换 printf("max=%d,min=%d.\n\n\n",a,b); printf("input 2 numbers:"); scanf("%d%d",&a,&b); if(a<b) {x=*pa;*pa=*pb;*pb=x;}         //方法二:改变指针指向内存单元的值,即改变ab值 printf("max=%d,min=%d.\n",a,b); } 2、用调用函数方式实现例1功能。 void maxmin(int *pa,int *pb) { int *p; *p=*pa; *pa=*pb; *pb=*p; //上述转换的只是各指针指向内存单元里的数值,不改变指向;这种方法等同于直接用数值变量 } void main() { int a,b,*pa,*pb; //指针变量名与形式参数名一直不引起冲突,因作用域不同 printf("input 2 numbers:"); scanf("%d%d",&a,&b); pa=&a;pb=&b; if(a<b) {maxmin(pa,pb);} printf("max=%d,min=%d.\n",a,b); } 引申下段程序: void maxmin(int *pa,int *pb) { int *p; p=pa; pa=pb; pb=p; } void main() { int a,b,*pa,*pb; printf("input 2 numbers:"); scanf("%d%d",&a,&b); pa=&a;pb=&b; printf("*pa=%d,*pb=%d.\n",*pa,*pb);       //原数 if(a<b) {maxmin(pa,pb);} printf("a=%d,b=%d.\n",a,b); printf("*pa=%d,*pb=%d.\n",*pa,*pb);      //调用函数改变的是形式参数指针变量的指向,不影响实际参数指针变量的指向,存放a和b内存单元的值也未受到影响 } 3、输入a,b,c三个整数,按大小输出 void maxmin(int *pa,int *pb) { int *p; *p=*pa; *pa=*pb; *pb=*p; } void main() { int a,b,c,*pa,*pb,*pc; printf("input 3 numbers:"); scanf("%d%d%d",&a,&b,&c); pa=&a;pb=&b;pc=&c; if(a<b) {maxmin(pa,pb);} if(a<c) {maxmin(pa,pc);} if(b<c) {maxmin(pb,pc);} printf("max=%d,middle=%d,min=%d.\n",a,b,c); printf("max=%d,middle=%d,min=%d.\n",*pa,*pb,*pc); }   第一次看指针,看过两遍,整个一章节还是有些头大,先作整理: 一、变量的指针和指向变量的指针变量 1、变量的指针即是存储变量的内存地址; 2、存放变量地址的变量称为指针变量; 3、指针变量的定义:类型说明符 *指针变量名称 例:int *a;  //声明一个指针变量a,a存放的值为地址,该地址指向一个整型变量。 4、指针变量的引用: (1)相关的运算符: 1)&:取地址运算符:作用对象为变量; 2)*:指针运算符:作用对象为指针变量。 (1)指针变量初始化: int a; int *p=&a; (2)赋值语句: Int a,*p;  //这里的*是指针变量说明符,与指针运算符含义不同 P=&a; 5、指针变量作为函数的参数 指针变量也是一种变量,自然可以作为函数参数,实际意义是将实际指针参数的值(即地址)赋值给调用函数的形式参数。 6、指针变量的其他运算: (1)对指针变量的加减运算 int a[5],*pa; pa=a; pa=pa+2;//指向第三个元素,即a[2] //指针变量的加减运算只能对数组指针变量进行(对其他无意义) (2)两个指针变量之间的运算:只有指向同一数组的指针变量之间才是有意义的。 二、数组指针和指向数组的指针变量 1、数组指针的定义:指向数组的指针。定义如下: int a[5]; int *p;      //因要指向的数组元素为整型数据,所以该指针变量也说明为int p=&a[0];   //初始化,指向数组a,等同于p=a; 2、通过数组指针对数组元素进行引用: 如上例中,则可以用以下方式表示第二个数组元素:*(p+1),也可以用数组名:*(a+1),因为数组名a实质上是一个常量,表示的是数组首地址。但须注意a和p的区别:a是常量,p是指针型变量。所以p++是可以的,而a++是错误的。 3、当数组名作为函数参数时,传递的实质也是地址。 4、指向多维数组的指针和指针变量 (1)对于int a[3][4]={{0,1,2,3,},{4,5,6,7},{8,9,10,11}}这个二维数组,可分解为a[0]、a[1]、a[2]三个一维数组(a[0]={0,1,2,3},a[1]=…);对于a[0]数组,包含a[0][0],a[0][1],a[0][2]三个元素. 通过二维数组名对数组元素地址的引用: 1)a[0]表示该数组名和首地址,即a[0][0]的地址,也是整个二维数组的首地址。a,&a[0][0],a[0]均表示首地址,此外,*(a+i)和&a[i]也可以表示二维数组中第i行的首地址,因此*(a+0)即*a和&a[0]也表示二维数组首地址。其他行的首地址可以类推。//注意,该段中a是二维数组名。 2)i行j列元素的地址: 直接用&a[i][j],或*(a+i)+j,或 a[i]+j; (2)指向二维数组的指针变量 定义格式:类型标示符 (*指针变量名)[二维数组的列数]。 以(1)中二维数组a为例,定义一个指向a的指针变量如下: int  (*pa)[4];  //a中元素为整型,a有4列 通过指针变量对二维数组元素地址的引用: 第i行第j列元素地址:*(p+i)+j;  三、函数指针变量 1、定义: 类型说明符 (*指针变量名)();//类型说明符表示该指针变量指向的函数返回值类型 2、作用:指向函数入口地址以调用函数  四、指针型函数 指针型函数返回的是指针值。 int *ap(int x,int y)   //int表示该函数返回的指针指向的是一个整型数据 {…}   //函数体  五、指针数组和指向指针的指针 1、指针数组表示数组元素为指针。各数组元素必须具有相同存储类型和指向相同数据类型。 2、指针数组的表示:类型说明符 *数组名[数组长度]。如 int *p[3]表示p是一个指针数组,有3个数组元素,存储的指针均指向整型数据。 3、指向指针的指针变量:如:int **p;表示指针变量p,其指向的依旧是一个指针变量:*p。

上一篇:VMware Workstation 8.0
下一篇:mvc在视图中使用递归生成树状结构

相关文章

关键词: 谭浩强C-指针

相关评论