C程序设计(谭浩强)--学习笔记 (指针)
2012-03-04 20:44
218 查看
指针运算符*和指针变量说明符*的区别
在指针变量说明中,*是类型说明符,注意:对应的**也是类型说明符,最多是类型不匹配。表示其后的变量时指针类型。
表达式中出现的“*”则是一个运算符,用来表示指针变量所指的变量。
指针变量的赋值运算有以下几种形式:
①指针变量初始化赋值,前面已作介绍。
②把一个变量的地址赋予指向相同数据类型的指针变量。例如:
int a,*pa;
pa=&a; /*把整型变量a的地址赋予整型指针变量pa*/
③把一个指针变量的值赋予指向相同类型变量的另一个指针变量。如:
int a,*pa=&a,*pb;
pb=pa; /*把a的地址赋予指针变量pb*/
由于pa,pb均为指向整型变量的指针变量,因此可以相互赋值。
④把数组的首地址赋予指向数组的指针变量。
例如:
int a[5],*pa;
pa=a; (数组名表示数组的首地址,故可赋予指向数组的指针变量pa)
也可写为:
pa=&a[0]; /*数组第一个元素的地址也是整个数组的首地址,
也可赋予pa*/
当然也可采取初始化赋值的方法:
int a[5],*pa=a;
⑤把字符串的首地址赋予指向字符类型的指针变量。例如: char *pc;pc="c language";或用初始化赋值的方法写为: char *pc="C Language"; 这里应说明的是并不是把整个字符串装入指针变量, 而是把存放该字符串的字符数组的首地址装入指针变量。 在后面还将详细介绍。
⑥把函数的入口地址赋予指向函数的指针变量。例如: int (*pf)();pf=f; /*f为函数名*/
指针的加减
int a[5],*p;
pa=a; /* pa指向数组a,也指向a[0] */
pa=pa+2; /* pa指向数组a[2],即pa的值为&pa[2] */
指针变量的加减运算只能对数组指针变量进行,对指向其他类型变量的指针变量作加减运算时毫无意义的。
NULL指针
NULL指针是一个无类型指针,并且值为0。
函数指针变量和指针型函数
int (*p)(); //()表示p是指向函数入口的指针;
p=f; //p指向函数f;
z=(*p)(x,y); //调用函数
int(*p)()是一个变量说明,说明p 是一个指向函数入口的指针变量,该函数的返回值是整型量,(*p)的两边的括号不能少。
int *p() 则不是变量说明而是函数说明,说明p是一个指针型函数,其返回值是一个指向整型量的指针,*p两边没有括号。作为函数说明,在括号内最好写入形式参数,这样便于与变量说明区别。
对于指针型函数定义,int *p()只是函数头部分,一般还应该有函数体部分。
指向二维数组的指针变量和指针数组
int (*p)[3]; 表示指向二维数组的指针变量。该二维数组的列数为3或分解为一维数组的长度为3。
int *p[3]; p表示一个指针数组,有三个下标变量p[0],p[1],p[2]均为指针变量。
指针数组
name数组 字符串
指针数组中的元素只能存放地址。
指针的数据类型总结
表9.2
二、指针运算小结
1、指针变量加/减运算
p++、p--、p+i、p-i、p+=i、p-=i
加1表示指向下一个数据。
2、指针变量赋值
p = &a; 变量a的地址赋给p,即指针p指向a
p = array; 数组array首地址赋给p
p = &array[i]; 数组元素array[i]的地址赋给p
p = max; 函数max的入口地址赋给p
p1 = p2; 指针p2的值赋给指针p1,即p1、p2所指的数据相同
p = 1000;
i = p;
int i;
int *p = &i;
*p = 100; 使p指向的数据(即变量i)等于100。
char *p = "I love China!"; 使p指向字符串
3、空指针 p = NULL;
空指针p=NULL表示p不指向任何数据。
在stdio.h中,NULL被定义为0:#define NULL 0
习惯上,不使用 p = 0
而使用 p = NULL
指针变量p可以与NULL作比较,例、
if (p == NULL) ...
4、指针变量相减。
当p1、p2指向同一个数组的元素,指针相假p2-p1等于p1、p2间的元素个数。
5、两个指针的比较
当p1、p2指向同一个数组的元素时,可以比较,如、p1 > p2。若p1、p2不是指向同一个数组的元素,比
较无意义。
三、空类型指针 void *
void *p,表示p是空类型指针,它可以指向任何数据类型。
空类型指针与其他类型指针之间赋值时,应进行强制类型转换,例:
char *p1;
void *p2;
p1 = (char *)p2;
p2 = (void *)p1;
结构体指针
一个结构指针变量虽然可以用来访问结构变量或结构数组元素的成员,但是,不能使它指向一个成员。
也就是说不允许取一个成员的地址来赋予它。因此,一下赋值是错误的。
ps=&boy[1].sex;
而只能是:
ps=boy;(赋予数组首地址)
或者是:
ps=&boy[0];(赋予0号元素首地址)
在指针变量说明中,*是类型说明符,注意:对应的**也是类型说明符,最多是类型不匹配。表示其后的变量时指针类型。
表达式中出现的“*”则是一个运算符,用来表示指针变量所指的变量。
指针变量的赋值运算有以下几种形式:
①指针变量初始化赋值,前面已作介绍。
②把一个变量的地址赋予指向相同数据类型的指针变量。例如:
int a,*pa;
pa=&a; /*把整型变量a的地址赋予整型指针变量pa*/
③把一个指针变量的值赋予指向相同类型变量的另一个指针变量。如:
int a,*pa=&a,*pb;
pb=pa; /*把a的地址赋予指针变量pb*/
由于pa,pb均为指向整型变量的指针变量,因此可以相互赋值。
④把数组的首地址赋予指向数组的指针变量。
例如:
int a[5],*pa;
pa=a; (数组名表示数组的首地址,故可赋予指向数组的指针变量pa)
也可写为:
pa=&a[0]; /*数组第一个元素的地址也是整个数组的首地址,
也可赋予pa*/
当然也可采取初始化赋值的方法:
int a[5],*pa=a;
⑤把字符串的首地址赋予指向字符类型的指针变量。例如: char *pc;pc="c language";或用初始化赋值的方法写为: char *pc="C Language"; 这里应说明的是并不是把整个字符串装入指针变量, 而是把存放该字符串的字符数组的首地址装入指针变量。 在后面还将详细介绍。
⑥把函数的入口地址赋予指向函数的指针变量。例如: int (*pf)();pf=f; /*f为函数名*/
指针的加减
int a[5],*p;
pa=a; /* pa指向数组a,也指向a[0] */
pa=pa+2; /* pa指向数组a[2],即pa的值为&pa[2] */
指针变量的加减运算只能对数组指针变量进行,对指向其他类型变量的指针变量作加减运算时毫无意义的。
NULL指针
NULL指针是一个无类型指针,并且值为0。
函数指针变量和指针型函数
int (*p)(); //()表示p是指向函数入口的指针;
p=f; //p指向函数f;
z=(*p)(x,y); //调用函数
int(*p)()是一个变量说明,说明p 是一个指向函数入口的指针变量,该函数的返回值是整型量,(*p)的两边的括号不能少。
int *p() 则不是变量说明而是函数说明,说明p是一个指针型函数,其返回值是一个指向整型量的指针,*p两边没有括号。作为函数说明,在括号内最好写入形式参数,这样便于与变量说明区别。
对于指针型函数定义,int *p()只是函数头部分,一般还应该有函数体部分。
指向二维数组的指针变量和指针数组
int (*p)[3]; 表示指向二维数组的指针变量。该二维数组的列数为3或分解为一维数组的长度为3。
int *p[3]; p表示一个指针数组,有三个下标变量p[0],p[1],p[2]均为指针变量。
指针数组
name数组 字符串
name---> | name[0] | ---> | Follow me |
name[1] | ---> | BASIC | |
p ---> | name[2] | ---> | Greate wall |
name[3] | ---> | Fortran | |
name[4] | ---> | Computer |
指针的数据类型总结
表9.2
定义 | 含义 |
int i; | 定义整型变量i。 |
if(条件)int *p | IF(条件)p为指向整型数据的指针变量。 |
int a ; | 定义整型数组a,它有n个元素。 |
int *p ; | 定义指针数组p,它由n个指向整型数据的指针元素组成 |
int(*p) ; | p为指向含n个元素的一维数组的指针变量。 |
int f( ); | f为带回整型函数值的函数。 |
int *p( ); | p为带回一个指针的函数,该指针指向整型数据。 |
int (*p)( ); | p为指向函数的指针,该函数返回一个整型值。 |
int * *p; | p是一个指针变量,它指向一个指向整型数据的指针变量。 |
1、指针变量加/减运算
p++、p--、p+i、p-i、p+=i、p-=i
加1表示指向下一个数据。
2、指针变量赋值
p = &a; 变量a的地址赋给p,即指针p指向a
p = array; 数组array首地址赋给p
p = &array[i]; 数组元素array[i]的地址赋给p
p = max; 函数max的入口地址赋给p
p1 = p2; 指针p2的值赋给指针p1,即p1、p2所指的数据相同
注意:
p = 1000;
i = p;
int i;
int *p = &i;
*p = 100; 使p指向的数据(即变量i)等于100。
char *p = "I love China!"; 使p指向字符串
3、空指针 p = NULL;
空指针p=NULL表示p不指向任何数据。
在stdio.h中,NULL被定义为0:#define NULL 0
习惯上,不使用 p = 0
而使用 p = NULL
指针变量p可以与NULL作比较,例、
if (p == NULL) ...
注意:空指针不指向任何数据,与p未赋值不同。当p未赋值时,其值是不确定的,而空指针的
值是确定数0。
4、指针变量相减。
当p1、p2指向同一个数组的元素,指针相假p2-p1等于p1、p2间的元素个数。
注意:指针相加无意义。
5、两个指针的比较
当p1、p2指向同一个数组的元素时,可以比较,如、p1 > p2。若p1、p2不是指向同一个数组的元素,比
较无意义。
三、空类型指针 void *
void *p,表示p是空类型指针,它可以指向任何数据类型。
空类型指针与其他类型指针之间赋值时,应进行强制类型转换,例:
char *p1;
void *p2;
p1 = (char *)p2;
p2 = (void *)p1;
结构体指针
一个结构指针变量虽然可以用来访问结构变量或结构数组元素的成员,但是,不能使它指向一个成员。
也就是说不允许取一个成员的地址来赋予它。因此,一下赋值是错误的。
ps=&boy[1].sex;
而只能是:
ps=boy;(赋予数组首地址)
或者是:
ps=&boy[0];(赋予0号元素首地址)
相关文章推荐
- C程序设计 第四版(谭浩强)-学习笔记-第六天
- C程序设计 第四版(谭浩强)-学习笔记-第五天
- C程序设计 第四版(谭浩强)-学习笔记-第十一天
- C程序设计 第四版(谭浩强)-学习笔记-第十天
- 网易云课堂程序设计入门--C语言第七周:指针与字符串学习笔记
- C程序设计 第四版(谭浩强)-学习笔记-第一天
- C程序设计 第四版(谭浩强)-学习笔记-第十三天
- C_PlusPlus学习笔记 - 5_数组、指针和字符串 (C++语言程序设计【第三版】 郑莉等,清华大学出版社)
- C程序设计 第四版(谭浩强)-学习笔记-第二天
- C程序设计(谭浩强)--学习笔记
- C程序设计 第四版(谭浩强)-学习笔记-第七天
- C程序设计 第四版(谭浩强)-学习笔记-第三天
- C程序设计 第四版(谭浩强)-学习笔记-第八天
- C程序设计 第四版(谭浩强)-学习笔记-第九天
- C语言之指针学习笔记
- C++基础学习笔记:指针
- java高并发程序设计学习笔记一前言
- Python学习笔记:程序设计的基础知识
- 《JavaScript高级程序设计 第三版》学习笔记 (五) 继承详解
- 指向二维数组的指针 学习笔记