C how to program 第八版 指针笔记
7.1引言
指针是C最难掌握的内容之一,指针使得程序能够按引用在函数之间传递参数,在程序执行期间创建和处理动态数据结构,即大小可以增大或者减小的数据结构,如链表、队列、堆栈和树。
7.2 指针变量的定义和初始化
指针就是其值为内存单元地址的变量。通常,一个变量包含一个特定的数值,而一个指针包含的是一个包含特定数值的变量地址。从这个意义上来说,变量名直接引用 一个值,而指针是间接引用一个值。通过指针引用一个值,称为间接寻址。
int *countPtr,count; //声明了一个int*类型的指针变量countPtr,指向整数的指针。指针可以被定义为指向任何类型的对象。
指针必须初始化,初始化可以在定义指针时进行,也可以通过一个赋值语句来完成。指针可以初始化为NULL,0或者一个地址。值为NULL表示它不指向任何对象,0表示等价于NULL,但是一般初始化为NULL。
7.3指针运算符
(&)和(*): 取地址运算符(&):它是一个一元运算符,它返回其操作数的地址值。
int y=5; int *yPtr; yPtr=&y; //将y的地址赋值给指针变量yPtr
间接寻址运算符(*):返回其操作数(即一个指针)指向的对象的值。
printf("%d",*yPtr);
int a=7;
int *aPtr=&a;
printf("The address of a is %p"
"
The value of aPtr is %p",&a,aPtr );
printf("
The value of a is %d"
"
The value of *aPtr is %d",a,*aPtr);
printf("
Showing that * and & are complements of"
"each other
&*aPtr=%p"
"
*&aPtr = %p
",&*aPtr,*&aPtr);
7.4按引用向函数传递实参
向函数传递的实参的方法有两种——按值传递和按引用传递。但是,C语言中所有实参都是按值传递。按值传递:return用来从被调函数向主调函数返回一个值(或者在不返回值的情况下将控制从被调函数中返回)。按引用传递支持被调函数通过修改主调函数中的变量,从而实现向主调函数“返回”多个值。
使用&和*实现按引用传递:
//按值传递
int cubeByValue(int n);
int number=5;
printf("The original value of number is %d",number);
number=cubeByValue(number);
printf("
The new value of number is %d ",number);
int cubeByValue(int n){
return n*n*n;
}
//按引用传递
void cubeByReference(int *nPtr);
int number=5;
printf("The origin value of number is %d
",number);
//这里我是这么理解的,一个指针变量首先你要有一个地址,然后指向这一块的笛之爱内容。所以&number是它的实参,因为指针主要的是需要知道它的地址。
cubeByReference(&number);
printf("
The new value of number is %d
",number);
void cubeByReference(int *nPtr){
*nPtr=*nPtr * *nPtr * *nPtr;
}
注:一个函数如果希望接收一个地址作为实参,就必须先定义一个指针类型的形参来接收这个地址。
函数原型的指针形参: (int *),函数原型中不必包含指针变量的名字,只需将这个(int *)写在圆括号内就可以了,其他变量类型也是一样的。
7.5对指针使用const限定符
const限定符的作用是为了告诉编译器被其限定的变量的值是不可以修改的。 向函数传递指针的方式有四种: 指向可变数据的可变指针; 指向可变数据的常量指针; 指向常量数据的可变指针; 指向常量数据的常量指针。
void convertToUppercase(char *sPtr);
char string[]="cHaRaCters and $32.98";
printf("The string before conversion is: %s
",string);
convertToUppercase(string);
printf("
The string after conversion is:%s
",string);
void convertToUppercase(char *sPtr){
while (*sPtr != ){
*sPtr=toupper(*sPtr);
++sPtr;
}
}
补充知识:
