关于C语言指针数组使用的小程序,在VC++6.0上编译通过,运行错误,越快越好,还有加分

实现字符串的排序、查找、插入
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char Sort(char*s[]);
char Search(char *s[],char*ww);
char Inset(char *s[],char*ww);

int main(void)
{
int i;
char *Pp[5],*Dest_in=NULL,*Dest_out=NULL;

for(i=0;i<5;i++)
{
scanf("%s",Pp+i);
}

Sort(Pp);
for(i=0;*Pp[i];i++)
{
printf("%s",Pp+i);
}
scanf("%s",Dest_in);
Search(Pp,Dest_in);
scanf("%s",Dest_out);
Inset(Pp,Dest_out);

return 0;
}

char Sort(char*s[])
{
int i,j,k;
char *Temp=NULL;

for(i=0,k=i;*s[i];i++)
{
for(j=i+1;*s[j];j++)
{
if(strcmp(s[k],s[j])>0)
{
*Temp=*s[k];*s[k]=*s[j];*s[j]=*Temp;
}
}
}

for(i=0;*s[i];i++)
{
printf("%s",s[i]);
}

return 0;
}

char Search(char *s[],char*ww)
{
int high,low,mid;
for(low=0;*s[low];low++);
high=low;
low=0;
mid=(high+low)/2;
while(low<=high)
{
mid=(high+low)/2;
if(strcmp(ww,s[mid])>0)
low=mid+1;
else if(strcmp(ww,s[mid])<0)
high=mid-1;
else
printf("%s is found",s[mid]);
}
return 0;
}

char Inset(char *s[],char*ww)
{
int i,j,n;
char *Temp=NULL;
for(n=0;*s[n];n++);

for(i=0;i<n;i++)
{
if(strcmp(s[i],ww)<0&&strcmp(s[i+1],ww)>0)
{
for(j=i;j<n;j++)
{
*Temp=*s[j+1];
*s[j+1]=*ww;
*ww=*Temp;
}
}
}
for(i=0;i<n;i++)
{
printf("%s",s+i);
}
return 0;
}

我知道有一个人写了一些文章然后有人整理了下来。
他写的东西都是代码, 而且是非常详细的注释那种的。
这个人叫管宁
你可以到网上搜搜。
我这里有给你贴出来一点,你可以看看是否合你的意:

在c/c++中利用数组名作为函数参数传递排序和用指针进行排序的例子。

以下两个例子要非常注意,函数传递的不是数组中数组元素的真实值而是数组在内存中的实际地址。

#include <stdio.h>

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 <stdio.h>

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 <stdio.h>

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 <stdio.h>

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的值达到真实改变的目的 */
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-01-05
大概看了一下子,我看你只有对 int 类型的指针的理解,
一视同仁的,应用到了 一元数组,和 2元数组上,

但是 数组指针和 整形int 指针,有很大区别,要理解也有点难。

就算给你改过来,你也会似懂非懂, 建议你还是 找个指针书籍
自己看一边,再来从新看这段代码的时候,你会拍脑袋的想,
这种错误太 丢人了。
--------------------------------
char *str="abc"; 只能 直接赋指,不能带入值,str = str2 -〉不可以.

char s[5][50]; 他的指针应该是 char (*s)[50];
说明 能输入 5行 一行50字节的 文字列数组。
输出 :
直接 printf("%s",s[0]); 就可输出 第一行。

要是 *s[0] ,这是输出字符了,是输出 0行 第一个字母。
第2个回答  2010-01-16
教给你一个很重要的方法:单步调试!
可以看到每一步的结果,当然也很容易知道程序错在哪里!知道错在哪里了,当然也就很容易改正啦本回答被提问者采纳
相似回答