#include <stdio.h>
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 <stdio.h>
#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<M;i++)
{
scanf("%d",&array[i]);
}
reversion(q1,q2);
q2 = arrays;//把指针调回来!q2 = arrays[0] 而不是 arrays[9]
printf_io(q2);
}
void reversion(int *q1,int *q2)
{
int k;
printf("Is the transformation\n");
printf("Please wait a moment\n");
for(k = 0;k<M;k++)
{
*(q2-k) = *(q1+k);//array[0]数组元素赋值给arrays[9];
printf("%d = %d\n",&*(q2-k),*(q2-k));//根据数组地址判断是否重末尾赋值
printf("%d = %d\n",&*(q1+k),*(q1+k));
}
printf("Conversion success!\n");
}
void printf_io(int *q1)
{
int j;
printf("output array reversion sort:\n");
for(j = 0;j<M;j++)
{
if(j == 9)
{
printf("%d",*(q1+j));//输出最后一个数组元素去掉-->
}
else
{
printf("%d-->",*(q1+j));
}
}
printf("\n");
}
第三个板块说一说类似于oo中多态概念,如何用指针来实现调用同意一个函数去实现不同的功能。
补充:我们知道五大区块,定义的字符串是声明到常量区的,只读不可写。而定义的数组之类定义在栈内存,先进先出,可读可写。这样如果我们用指针变量声明一个字符串常量(初始化之后不可改变属性),想把字符串常量的值做改变(把其他值复制或者改变属性),会出现报错,提示无法写的概念。
#include <stdio.h>
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]),我们传参不用吧整个数组传递,只需要把首地址传递即可,我们也可以根据需要移动指针即可。文采水平有限,表达可能并不是那么生动,只有亲手去敲了才能体会奥妙所在。
原文地址:http://blog.51cto.com/13352079/2113041