指针复习断断续续两个星期,基本告一段落,心得笔记与大家一起分享知识,指针用我的体会来说,简直是玄之又玄,众眇之门。
整个学习其实是围绕指针与指针变量两个关键点,指针与指针变量个人理解如下:
指针:
我们声明定义变量(×××、字符串、函数等),变量会存于常量区、栈内存等里面,指针就是用于指向他们存储的位置,更贴切的说指针也是需要开辟空间的,指针的值就是我们存储的变量。
指针变量
指针 变量只能存放指针,听起来很绕口,就是只能存地址,不可以存变量。
两个符号操作如下
*号用于取值操作,&用于取地址操作。
光说基本是理解不了的,来代码中详细咱们在详细解释
#include
void main()
{
int *p1,*p2,*p,a,b;//*p1,*p2,*号开头的都是声明的指针变量
scanf("%d,%d",&a,&b);
p1 = &a;//&a是a的地址(a的指针),*p1指针变量存放a的地址,这就是指针与指针变量的关系
p2 = &b;
if( a < b)
{
p = p1;
p1 = p2;
p2 = p;
}
printf("%d,%d\n",a,b);//变量值,同等于下
printf("%d,%d\n",*&p1,*&p2);//右到左,先&后*,意思取&a地址,然后*取地址的值。
printf("%d,%d\n",&a,&b);//取变量值的地址同等于下
printf("%d,%d\n",&*p1,&*p2);//右到左,先*后&,意思取*a的变量值,然后&取值的地址。
printf("%d,%d\n",*p1,*p2);//p1里面存的是地址变量,*取p1里面的值(地址变量),同等于a,b;
}
下面板块聊聊数组(一维与多维)如何去定义
一维数组与二维数组或者三维、四维数组,在真正存储内存中以线性进行存储,都是成一条线的,存储在栈内存,栈内存如先进先出等机制,可读可写。代码中有详细的注释,我们思路可以把多为数组用一维数组的思想去循环
#include
#define M 10
void reversion(int *q1,int *q2);
void printf_io(int *q1);
void main()
{
int i,*q1,*q2,array[M],arrays[M];
q1 = array;//等于数组第一个元素变量地址array[0];
//q2 = arrays;//有办法让q2指针等于arrays[9]吗?
q2 = &arrays[9];
printf("Please enter numbers:\n");
for(i = 0;i
}
else
{
printf("%d-->",*(q1+j));
}
}
printf("\n");
}
第三个板块说一说类似于oo中多态概念,如何用指针来实现调用同意一个函数去实现不同的功能。
补充:我们知道五大区块,定义的字符串是声明到常量区的,只读不可写。而定义的数组之类定义在栈内存,先进先出,可读可写。这样如果我们用指针变量声明一个字符串常量(初始化之后不可改变属性),想把字符串常量的值做改变(把其他值复制或者改变属性),会出现报错,提示无法写的概念。
#include
int process(int (*p)());
int max(int a,int b);
int min(int a,int b);
int sum(int a,int b);
void main()
{
int a,b;
int (*p)(),(*p1)(),(*p2)();
printf("Please input a/b numbers:\n");
scanf("%d,%d",&a,&b);
p = max;
p1 = min;
p2 = sum;
printf("%d\n",process((*p)(a,b)));
printf("%d\n",process((*p1)(a,b)));
printf("%d\n",process((*p2)(a,b)));
}
int max(int a,int b)
{
if(a>b)
{
return a;
}
else
{
return b;
}
}
int min(int a,int b)
{
if(a>b)
{
return b;
}
else
{
return a;
}
}
int sum(int a,int b)
{
int sum;
sum = a+b;
return sum;
}
int process(int (*p)())
{
int z;
z = p;
return z;
}
本代码确实有一定的逻辑Bug,有些逻辑不严谨(传参),后续会继续改进,只有敲过才知道指针灵活强大无比,很随心所欲。当然层面深了多线程之类会出现越界严重等问题。在补充一些,指针变量都是指向数组的首个地址,如一维数组来说p=a(*p = a[0]),我们传参不用吧整个数组传递,只需要把首地址传递即可,我们也可以根据需要移动指针即可。文采水平有限,表达可能并不是那么生动,只有亲手去敲了才能体会奥妙所在。