前叙 : 原先对C语言的学习,对指针有恐惧感.当C语言学到一定的程度的时候,
再学习指针有种水到渠成的感觉。
1.指针变量
对指针变量的定义包括三个内容
1)指针类型说明,即定义变量为一个指针变量
2)指针变量名
3)变量值(指针)所指向的变量的数据类型;
一般是这样的: 类型说明符 *变量名 int = *p;
这个小星星号 * 表示这是一个变量.
指针变量的引用
1) &:取地址运算符 就像你给别人打了一顿,甚是不服,
然后找他家的地址(指针的地址),去他家偷偷埋伏拿起搬砖报复他.
2) * :指针运算符 (又或称 "间接访问"的运算符)
指针变量初始化的方法.
int a ; int *p = &a; 又或者下面这种,赋值法 int a ; int *p; p =&a; 两种的方法的目的都是为指向变量的地址.
指针使用的时候注意事项:
1.指针变量的命名规则和凄然变量的命名的规则一样
2.指针不能与现有的变量同名
3.指针可存做C语言中的任何基本数据类型,数据和其他所有高级数据结构的地址
4.若指针已声明为指向某种类型数据的地址,则他不能用于存储其他类型的数据的地址
5.应为指针指定一个地址后,才能在语句中使用指针
指针P在执行某时刻指向变量X,在另一个时刻也可以指向变量y
数组指针
存储在一块的内存空间中
数组名就是这块的连续内存空间的首地址
指针本身是一个变量
*根据地址取值- 顺藤摸瓜;
指针不可以赋常量
指针式一个变量,存储另个变量的内存地址
指针的声明由基本类型,星号(*)和变量名组成
为指针估值,赋值运算右侧必须是一个地址如果是指针变量需要在前面加一个取地址运算符&;
如果是另一个指针变量或者是一个数组,不需要加&运算符
运算符* 用于返回指针指向的内存地址中存储的值
使用指针访问一维数组和二维数组的元素
例程
int main() { int i,j; //二维数组的理解 ,1-是由个N个数组所组成 double score[5][3] = { {55,24,77}, {52,62,77}, {15,26,77}, {54,65,77}, {53,66,77}, }; for(i = 0;i<5;i++) { for(j = 0;j<3;j++) { //printf("%d\t",score[i][j]); //第一种指针输出方式 //printf("%.2lf\t",*(score[i]+j)); //第二种指针输出方式 printf("%.2lf\t",*(*(score+i)+j)); //i表示指向行,j表示指向列 输出数组 } printf("\n"); } /* for(i = 0;i<3;i++) { printf("%.2lf\t",score[0][i]); } return 0; */ } /* 输出的结果为数组的元素 */
指针的算术运算
指针的递增和递减(++.--)
例程:
int i ; double score[5] = {98,87,65,43,76} double *ptr_score; for(i = 0;i<5;i++) { printf("%.%2lf\n",*ptr_score++);//没++之前是指向是首地址 ++后指向第二个元素往后也是以此类推 double每次++走8个字节 ,int 每次走4个字节 }
int i ; double score[5] = {98,87,65,43,76} double *ptr_score; for(i = 0;i<5;i++) { //printf("%.2lf\n",ptr_score[i]);访问数组元素的第一种 //prinft("%.2lf\n",*(ptr_score +i));访问数组元素的第二种 (常用,而且指针的地址没有变化) printf("%.%2lf\n",*ptr_score++); //第三种,打印之前,重新访问数组元素钱,记得重置指针的位置 }
int i ; double score[5]={98,87,65,43,76} double *ptr_score; ptr_score = &score[1]; ptr_score += 2 ; //指向数组2的地址 ptr_socre -=3;//指针减去3 值为0;
结构指针
结构指针变量的说明和使用
/* 结构指针变量的一般形式为: struct 结构名 *结构指针变量名 定义stu 这个结构,如要说明一个 指向stu 的指针变量 pstu,可写为: struct stu *ptu; 结构指针变量,就能更方便地访问结构变量的各个成员 其访问的一般形式为 (*结构指针变量).成员名 或为: 结构指针变量 ->成员 例如: (*pstu).num 或者 pstu->num 注意(*pstu)两侧的括号不可少,固成员"."优先级高于"*". 如去掉括号写作 *pst.num 则等效于 *(pstu.num),这样意义就完全不对了. */
第一次发博客,如有不足,望求指出,后续修改!!