HOHO,下面的程序要求是,输入3个字符串,按由小到大的顺序输出。
偶第一次用指针,知道我的程序有无数个错误,但是不明白确切错在哪里,请高手指教。
虚心学习ing~~
===============// test.cpp : Defines the entry point for the console application.
////#include "stdafx.h"
#include <stdio.h>
#include <string.h>void swap(char *p1,char *p2)
{
char *p3=0;
*p3=*p1;*p1=*p2;*p2=*p3;
}void main()
{
char *pointer_1=0,*pointer_2=0,*pointer_3=0;
gets(pointer_1);
gets(pointer_2);
gets(pointer_3);
if (strcmp(pointer_1,pointer_2)>0)swap(pointer_1,pointer_2);
if (strcmp(pointer_1,pointer_3)>0)swap(pointer_1,pointer_3);
if (strcmp(pointer_2,pointer_3)>0)swap(pointer_2,pointer_3);
puts(pointer_1);
puts(pointer_2);
puts(pointer_3);
}
偶第一次用指针,知道我的程序有无数个错误,但是不明白确切错在哪里,请高手指教。
虚心学习ing~~
===============// test.cpp : Defines the entry point for the console application.
////#include "stdafx.h"
#include <stdio.h>
#include <string.h>void swap(char *p1,char *p2)
{
char *p3=0;
*p3=*p1;*p1=*p2;*p2=*p3;
}void main()
{
char *pointer_1=0,*pointer_2=0,*pointer_3=0;
gets(pointer_1);
gets(pointer_2);
gets(pointer_3);
if (strcmp(pointer_1,pointer_2)>0)swap(pointer_1,pointer_2);
if (strcmp(pointer_1,pointer_3)>0)swap(pointer_1,pointer_3);
if (strcmp(pointer_2,pointer_3)>0)swap(pointer_2,pointer_3);
puts(pointer_1);
puts(pointer_2);
puts(pointer_3);
}
1、*p3=*p1;*p1=*p2;*p2=*p3;
改成p3=p1;p1=p2;p2=p3;
2、有十年年没用过gets函数了,如果我没有记错的话,该函数不会自动开辟一块内存供你用,换言之,你这样用是不行的,换成
char buf1[100];
char buf2[100];
char buf3[100];
pointer_1=buf1;
pointer_2=buf2;
pointer_3=buf3;
#include <stdio.h>
#include <string.h>void swap(char **p1,char **p2)
{
char *p3;
p3=*p1;*p1=*p2;*p2=p3;
}void main()
{
char buf1[100];
char buf2[100];
char buf3[100];
char* pointer_1=buf1;
char* pointer_2=buf2;
char* pointer_3=buf3; gets(pointer_1);
gets(pointer_2);
gets(pointer_3);
if (strcmp(pointer_1,pointer_2)>0)
swap(&pointer_1,&pointer_2);
if (strcmp(pointer_1,pointer_3)>0)
swap(&pointer_1,&pointer_3);
if (strcmp(pointer_2,pointer_3)>0)
swap(&pointer_2,&pointer_3); puts(pointer_1);
puts(pointer_2);
puts(pointer_3);
}//看起来挺复杂,你可以使用引用的方法
//程序目的:排序指针数组
#include<iostream>
#include<string>
using namespace std;void Sort(char *p[],int n);char *Subject[]={
"C",
"C++",
"Basic",
"Pascal",
"MFC",
"VCL",
"STL",
0
};int main(void)
{
char *ps=0;int i=0;
char **pSubject=Subject; Sort(Subject,7);
cout<<"Displaying the subject array...\n"<<endl;
//while(i<7)cout<<"NO."<<i<<" subject: "<<*(Subject+i++)<<endl; //不能这样写:cout<<"NO."<<i<<" subject: "<<*((Subject+i)++))<<endl; 因为++运算符只能作用于变量,不能是表达式。
//while(i<7)cout<<"NO."<<i<<" subject: "<<Subject[i++]<<endl;
//while(i<7){ps=Subject[i++];cout<<"NO."<<i<<" subject: "<<ps<<endl;}
//while(i<7){ps=*(Subject+i++);cout<<"NO."<<i<<" subject: "<<ps<<endl;}
//while(i<7){pSubject=Subject+i++;cout<<"NO."<<i<<" subject: "<<*pSubject<<endl;}
//while(i<7){pSubject=&Subject[i++];cout<<"NO."<<i<<" subject: "<<*pSubject<<endl;}
//while(*pSubject!=0)/*此句不能这样写: while(pSubject!=0)*/cout<<"NO."<<i++<<" subject: "<<*pSubject++<<endl; //for(i=0;i<7;i++)cout<<"NO."<<i<<" subject: "<<*(Subject+i)<<endl; //for(i=0;i<7;i++)cout<<"NO."<<i<<" subject: "<<Subject[i]<<endl;
//for(i=0;i<7;i++){pSubject=Subject+i; cout<<"NO."<<i<<" subject: "<<*pSubject<<endl;}
for(i=0;*pSubject!=0;i++)cout<<"NO."<<i<<" subject: "<<*pSubject++<<endl; cout<<"\nDisplaying the subject array is completed."<<endl;//更多方法可自己进行推断
return 0;
}void Sort(char *p[],int n)
{
char *pTemp;
int nSign;
for(int i=0;i<n-1;i++)
{
nSign=i;
for (int j=i+1;j<n;j++)
if(strcmp(p[nSign],p[j])>0)
nSign=j;
if(nSign!=i)
{
pTemp=p[nSign];
p[nSign]=p[i];
p[i]=pTemp;
}
}
}
/*小结:p++ 或++p会改变指针变量自身的值(地址), p+1 不会改变指针变量自身的值;(*p)++ 或++(*p)或 ++*p 会改变指针变量指向的变量的值,*p+1不会改变指针变量指向的变量的值*/
1.指针是一种数据类型。无论它是指向哪种类别的变量,它自身的长度是一样。2。使用指针时请注意: 无论什么情况下
*(。。)是取{。。}的内容
&(..)是取(..)的地址
既无 * 也无 &,直接使用指针名是取该指针指向的地址
指针可以做算术运算(+、-),以所指向的类型的长度为基本单位改变。
*的优先级比 ++ 高。3.紧记2中的原则,那么下面的例子你都会觉得理所当然,很容易。
eg : sort* p;//sort是一种数据类型,可以是int,float,char,string ,or class_name...
下面以int为例;
int n = 10;
int* p = &n;//&是取地址,&n就是取n的地址,即把n的地址赋给指针p
int n1 = *p;//*是取内容,so, n1 = p指向的内容,即n;so n1 == n == 10
cout<< p <<endl;//直接使用指针名是取该指针指向的地址,即n的地址addr_n
cout << &n << endl;//上句输出的结果和该句相同。下句则和该句不同
cout << &p <<endl;//取该指针地址,即p自身的地址addr_p p += 2;
cout << P << endl; //输出addr_n + 2*lengthof(int)
cout << &p << endl;//输入仍然为addr_p,因为该指针变量的地址自一开始就分配好了,在运行期间始终不变。 //回到 p =&n;
*p++;//和任何自增表达式相同,该表达式的含义有二:1。表达式的值为*p,即10; 2。该表达式过后,p++,即p指向下一个int
(*P)++;//和任何自增表达式相同,该表达式的含义有二:1。表达式的值为*p,即10; 2。该表达式过后,p指向的内容++, 即n = 11;
++*p;++(*p);是对应的前缀表达
以上是自己的一点体会,请高手指教!