众所周知,指针是C语言中最重要也是最难的一种数据类型,这是C语言中与其他类似于Java等语言不同的直接操纵内存的一种数据。也有人如此形容指针的重要性“如果你C语言中除了指针都学得很好,信手拈来,唯独不会指针,那么你就是没学过C语言!”。下面来回忆一下这段时间学习指针的心得。
1 定义的格式: 指向内容的数据类型 *指针变量名
例如: int *p;
2 指针的赋值问题
int a=10;
int *p=&a;//指针p指向的a的地址值
int *p;
p=&a //这两种赋值都可以.
printf("%d",*p);//输出的值为10
3使用指针改变实参的值 ,如下代码,指针直接改变内存,改变后指向的变量值也被改变。
#include <stdio.h> void change(int *p) { *p=20;//改变指针指向的地址的数据值为20 } int main(int argc, const char * argv[]) { // insert code here... int x=10; int *p=&x; //指针p指向x的地址值 change(p); //调用change函数 printf("x的值为%d",x);//输出x的值 x=20 因为指针直接干预内存改变实参的值 return 0; }
4.指针定义时的注意点
1> int *p; p = 1000; //错误写法
2>int *p; *p = 100;// 错误写法 p指向的变量的值赋值为100 但p没有指向任何地点
3> int *p; *p = &a; //错误写法
4> %p输出指针里面存储的地址值
5>其他指针类型说明,比如float *p; char *p;
6>不能乱用类型,比如int a = 10; float *p = &a;
5 清空指针的方法
p=0;或者p=NULL;
6指向指针的指针
可能初学者接触指针这个概念会有点混淆,对于指向指针的指针就有点更摸不着头脑了,其实只要理解了指针的含义,在考虑清楚想清楚后可以一点点的推敲出来,实在不行的话可以像老师视频教学中一样画一个内存的分析图,很多问题就可以清晰明了了,指向指针的指针表示定义一个指针指向原有的指针,下面通过一段代码体会一下:
#include <stdio.h> int main() { int a = 10; int *p = &a; *p = 20; // *p表示指针变量p访问a的存储空间并将20赋值,相当于*p==a==20 int **pp = &p; // 指向指针变量p的指针 **pp = 20; // 这句实际就是*pp==p 因此**pp==*p==a也就是把20赋值给a return 0; }
这段代码中*p指向了a的地址值,**pp指向了*p的地址值,相当于 *p=**pp=a。规律:指针中有几个*号就相当于指针指了几次。
7 指针所占的内存空间,无论指针是任何类型的,都占据了8个字节,从以下代码可以看出
#include <stdio.h> int main(int argc, const char * argv[]) { int a=10; char b=‘a‘; double c=12.34; int *ap = &a; char *bp = &b; double *cp = &c; printf("*ap占据%zd个字节\n",sizeof(ap)); //8 printf("*bp占据%zd个字节\n",sizeof(bp)); //8 printf("*cp占据%zd个字节\n",sizeof(cp)); //8 return 0; }
8.指针与数组
指向数组的指针 :
int age[]={1,2,3};
int *p=age;//age 不加&。数组名就是数组的地址值。
#include <stdio.h> int main(int argc, const char * argv[]) { int age[]={1,2,3,4,5,6,7}; int *p=age; for (int i=0; i<7; i++) { //遍历数值 printf("第%d个数是%d\n",i+1,*(p+i)); //p+i 相当于取出数组中第i+1个值 } return 0; }
用下面的代码来巩固一下指针与数组的关系,设计一个函数求前n个数的和
#include <stdio.h> int arraySum(int *p,int n) { int result=0; for (int i=0; i<n; i++) { result+=*(p+i); } return result; } int main(int argc, const char * argv[]) { int number[]={12,23,45,24,35,13,24}; int *np=number; int result=arraySum(np,4); printf("数据的和为%d",result); return 0; }
9指针与字符串
1>定义方法: char s[]="jack";
char *p=s或者
char *p;
p=s;
定义字符串的两种方式
a. 利用数组
char name[] = "itcast";
特点:字符串里面的字符是可以修改的
使用场合:字符串的内容需要经常修改
b. 利用指针
char *name = "itcast";
特点:字符串其实是一个常量字符串,里面的字符是不能修改
使用场合:字符串的内容不需要修改,而且这个字符串经常使用
10.指向函数的指针
1>函数作为一段程序,在内存中也要占据部分存储空间,它也有一个起始地址,即函数的入口地址。函数有自己的地址,那就好办了,我们的指针变量就是用来存储地址的。因此,可以利用一个指针指向一个函数。其中,函数名就代表着函数的地址。
2>定义的格式: 函数的返回值类型 (*指针变量名)(形参1, 形参2, ...);
3> 由于这类指针变量存储的是一个函数的入口地址,所以对它们作加减运算(比如p++)无意义,
主要用途为: (1)调用函数(2)将函数作为参数在函数间传递。
总结:本章主要学习了指针,指针是整个C语言的精华,就像老师所说的,如果指针没有学习好,C语言学得再好也相当于没有学过C语言,可见指针在C语言学习中的重要性,而本章主要学习了指针的定义和使用注意,指向指针的指针,指针和数组,指针和字符串,指向函数的指针等,其中重点需要掌握的是指针和数组以及指针和字符串,这两个知识点相当于把整个本章的知识都整合串联到了一起,要领会指针在使用时的作用和在存储空间里的作用,指针就一个作用:能够根据一个地址值,访问对应的存储空间(包括取值和赋值),理解了这层含义指针就没什么难的。PS:本章知识是C语言重点的重点,需要多加练习,时常复习!