
我知道有一个人写了一些文章然后有人整理了下来。
他写的东西都是代码, 而且是非常详细的注释那种的。
这个人叫管宁
你可以到网上搜搜。
我这里有给你贴出来一点,你可以看看是否合你的意:
在c/c++中利用数组名作为函数参数传递排序和用指针进行排序的例子。
以下两个例子要非常注意,函数传递的不是数组中数组元素的真实值而是数组在内存中的实际地址。
#include <stdioh>
void main(void)
{
void reversal();
static int a[10] = {0,1,2,3,4,5,6,7,8,9}; / 建立一个数组并初始化 /
int i;
for (i=0;i<10;i++)
{
printf("%d ",a);
}
printf("\n");
reversal(a,10); / 调用自定义涵数进行反向显示排序,并把数组a的起始地址传送给形式参数x /
for (i=0;i<10;i++)
{
printf("%d ",a);
}
printf("\n");
}
void reversal(x,n)
int x[],n; / 定义形式参数 /
{
int m=(n-1)/2; / 计算10个数需要循环几次,因为是两两调换第一个数组是x[0]故应该是int(9/2) /
int temp,i,j; / 建立零时变量temp用于每次交换处理时零时存储x的值 /
for (i=0;i<=m;i++)
{
j=n-1-i; / 反向计算出被调换的数组下标,例如x[0] 对应的x[n-1-i]就是x[9] /
temp=x;
x=x[j];
x[j]=temp;
}
}
/ 次题需要注意的是:这里由于a[10]和x[10]是共同享内存地址位的所以进行交换后a[10]的实际值也就发生了改变 /
#include <stdioh>
void main(void)
{
void reversal();
static int a[10] = {0,1,2,3,4,5,6,7,8,9}; / 建立一个数组并初始化 /
int i;
for (i=0;i<10;i++)
{
printf("%d ",a);
}
printf("\n");
reversal(a,10); / 调用自定义涵数进行反向显示排序,并把数组a的起始地址传送给形式参数x /
for (i=0;i<10;i++)
{
printf("%d ",a);
}
printf("\n");
}
void reversal(x,n)
int x,n; / 定义x为指针变量 /
{
int temp,p,i,j; / 这里需要注意的是temp用与交换的时候临时存储数据的 /
i = x; / 利用指针变量i存储数组a的起始地址 /
p = x + ((n-1)/2); / 计算最后一次循环的时候数组a的地址 /
j = x + n - 1; / 计算数组a也就是a[9]的结束地址好用于交换 /
for (;i<=p;i++,j--) / 利用循环和指针进行数组元素值的交换 /
{
temp=i; / 用temp临时存储i也就是循环中a实际的值 /
i=j;
j=temp;
}
}
/ 此例同样要注意到利用指针进行数组的 *** 作同样改变了实际数组各元素的值 /
==============================
c/c++中指针学习的两个绝好例子
对于众多人提出的c/c++中指针难学的问题做个总结:
指针学习不好关键是概念不清造成的,说的简单点就是书没有认真看,指针的学习犹如人在学习饶口令不多看多学多练是不行的,下面是两个很经典的例子,很多书上都有,对于学习的重点在于理解x和x的理解,他们并不相同,x所表示的其实就是变量a本身,x表示的是变量a在内存中的地址,如果想明白可以输出观察cout<<x"|"x;,当定义了int x;后对x=&a的理解的问题。仔细阅读和联系下面的两个例子我想指针问题就不是难点了!
#include <stdioh>
main()
{
int a,b; / 定义a,b两个整形变量用于输入两个整数 /
int point_1,point_2,temp_point; / 定义三个指针变量 /
scanf("%d,%d",&a,&b); / 格式化输入a,b的值 /
point_1=&a; / 把指针变量point_1的值指向变量a的地址 /
point_2=&b; / 把指针变量point_2的值指向变量b的地址 /
if (a<b)
{
temp_point=point_1; / 这里的temp_point是用于临时存储point_1的值也就是变量a的地址的 /
point_1=point_2; / 把point_2的值赋予point_1 /
point_2=temp_point;
/ 由于point_1的值已经改变无法找到,利用前面临时存储的也就是temp_point找回原point_1的值赋予point_2,打到把point_1和point_2值对换的目的/
}
printf("%d,%d",point_1,point_2); / 利用point_1和point_2也就是分辨指向b和a的方法把值显示自爱屏幕上 /
}
/ 此题需要注意和了解是的此法并没有改变变量a,b的值只是利用指针变量分别存储a和b的地址,然后再把那两个指针变量的值对换一下其实就是存储在
指针变量里面a与b的地址对换,在利用point_1和point_2的方式把调换后的值显示出来这里的point_1实际就是a,此中算法并非真的改变a,b的值,而是
利用指针进行地址交换达到大小排序的目的
/
#include <stdioh>
main()
{
int a,b; / 定义a,b两个整形变量用于输入两个整数 /
int point_1,point_2; / 定义三个指针变量 /
scanf("%d,%d",&a,&b); / 格式化输入a,b的值 /
point_1 = &a; / 把指针变量point_1的值指向变量a的地址 /
point_2 = &b; / 把指针变量point_2的值指向变量b的地址 /
compositor(point_1,point_2); / 调用自定义的排序涵数,把a,b的地址传递给point_1和point_2 /
printf("%d,%d",a,b); / 打印出a,b的值 /
}
static compositor(p1,p2)
int p1,p2; / 定义形式参数p1,p2为指针变量 /
{
int temp; / 建立临时存储变量 /
if (p1<p2) / 如果p1<p2,注意这里的p1和p2其实就是a和b /
{
temp = p1; / 利用变量temp用于临时存储p1和就是a的值 /
p1 = p2; / 将p1的值也就是a的值换成p2的值也就是b的值,等价于a=b /
p2 = temp; / 将p2的值也就是temp的值等价于b=temp /
}
}
/ 注意:此题与上题不同的是,直接改变了a于b的值达到真实改变的目的 /
#include <stdioh>
main( )
{
int a=10,b=100,c=1000; //调试:a(0x0012ff7c) b(0x0012ff78)
c(0x0012ff74) 整型在C++中占4位
可以看出a,b,c内存单元是连续的
int p=&c; //这里p指向c的内存单元
for(int i=0;i<10;i++)
printf("%d,",p++);//内存当中abc的存储顺序为c,b,c,
printf("\n");
}
由于你将p指向了c,所以显示时将从c内存单元里的内容开始,依次向后移动4位,而a,b,c在内存中是相邻的,所以显示结果为c,b,a,由于0x0012ff80地址以后的内存单元没有用到,里面是随机数,所以以后显示的数字将不确定
该类可以提供移动,求到另一点的距离,获取X坐标和Y坐标等 *** 作,也可以设置X坐标和Y坐标的值。要求有拷贝构造函数。数据成员为X坐标和Y坐标。
源代码如下
using namespace std;
class Point{
public:
Point(); //不带参数构造函数
Point(int X, int Y); //带参数的构造函数
Point(const Point &p); //拷贝构造函数;
int getX(); //获取横坐标
int getY(); //获取纵坐标
void setX(int iX); //设置横坐标
void setY(int iY); //设置纵坐标
float distance(Point p1, Point p2); //计算两点的距离protected:
private:
int x; //横坐标
int y; //纵坐标
};
int main()
{
Point pos;
Point pt(10, 10);
Point pts(pt);
cout << "获取pos的坐标值" << endl
cout << "X:" << posgetX() << endl;
cout << "Y:" << posgetY() << endl;
possetX(20);
possetY(20);
cout << "获取pos的设置后的坐标值" << endl;
cout << "X:" << posgetX() << endl;
cout << "Y:" << posgetY() << endl;
cout << "获取pt的坐标值" << endl;
cout << "X:" << ptgetX() << endl;
cout << "Y:" << ptgetY() << endl;
cout << "获取pts的坐标值" << endl;
cout << "X:" << posgetX() << endl;
cout << "Y:" << posgetY() << endl;
cout << "输出pos与pt之间的距离" << endl;
cout << "X:" << posdistance(pos, pt) << endl;
return 0;
}
扩展资料
一个点类Point,有2个私有数据成员x,y代表点坐标的源代码
include
#include
using namespace std;
class Point
{
public:
Point(int a,int b):x(a),y(b){cout<<"初始化点类的一个对象\n";}
~Point(){cout<<"回收点类的内存空间\n";}
void show()
{cout<<"这个点的坐标为:"<<"("< double distance(Point &p){return sqrt((py-y)
(px-y)+(px-x)(px-x));}
private:
int x;
int y;
};
int main()
{
Point a(0,0);
Point b(1,1);
cout< return 0;
}
friend void distance1(Point &,Point &);这段代码不是声明,只是友元的申请,不一定有效,在class上面写个真正的函数申明就可以了
好像你的问题不够清楚,以前三个Java类,其中一个测试类,toString方法体现了多态
/ Pointjava /
public class Point {
public double x;
public double y;
public Point(double x,double y){
thisx = x;
thisy = y;
}
@Override
public String toString() {
return "Point [x=" + x + ", y=" + y + "]";
}
}
/ColorPointjava/
import javaawtColor;
public class ColorPoint extends Point{
public Color color;
public ColorPoint(double x, double y,Color color) {
super(x, y);
thiscolor = color;
}
@Override
public String toString() {
return "ColorPoint [color=" + color + ", x=" + x + ", y=" + y + "]";
}
}
/TestPointjava/
import javaawtColor;
public class TestPoint {
public static void main(String[] args) {
Point point = new Point(3,4);
ColorPoint colorPoint = new ColorPoint(2,3,Colorblack);
Systemoutprintln(pointtoString());
Systemoutprintln(colorPointtoString());
}
}
以上就是关于C语言,关于指针 (point) 的程序。文字列的长度。全部的内容,包括:C语言,关于指针 (point) 的程序。文字列的长度。、C语言,关于指针 (point) 的程序。拜托了。谢谢。、c++编写一个点类Point,功能包括输出点的坐标,移动到新位置及输出它与另一个点的距离等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)