c语言指针例题

来源:互联网 发布:监狱建筑师 mac 汉化 编辑:程序博客网 时间:2024/05/22 10:16
第一题:
int main() {
double salarys[5] = { 1500, 2000.43, 1202.78, 8000.32, 5000 };
int i = 0;
for (i = 0; i < 5; i++) {
printf("%6.2lf\n", salarys[i]);
}
int *p;
p = &salarys;
int *m;
m = &salarys[0];
printf("%x\n", p);
printf("%x\n", m);
int *n;
n = &salarys[4];
printf("%x\n", n);
printf("%x\n", &salarys[4]);
double *head;
head = &salarys;
double *tail = &salarys[4];
printf("%x\n", head);
printf("%x\n", tail);
printf("%6.2lf\n", *head);
printf("%6.2lf\n", *tail);
printf("%x\n", tail - head);
*head = salarys[0] - 50;
printf("%6.2lf\n", *head);
printf("%6.2lf\n", *head + 6550.32);
head = &salarys;
for (i = 0; i < 5; i++) {
printf("%6.2lf\n", *(head + i));
}
tail = &salarys;
for (i = 4; i >= 0; i--) {
printf("%6.2lf\n", *(tail + i));
}
return EXIT_SUCCESS;
}
第二题:
编写一个函数,此函数能够接收下面所有数据类型变量的地址,并能够在函数中将其值打印。
int main(){
 int a = 1;
 char c = 'c';
 float f = 11.11;
 double d = 22.222;
 void *p,*p1,*p2,*p3;
 p = &a;
 printf("%d\n", *((int*)p));
 p1 = &c;
 printf("%d\n", *((char*)p1));
 p2 = &f;
 printf("%2.2lf\n", *((float*)p2));
 p3 = &d;
 printf("%2.4lf\n", *((double*)p3));
 return EXIT_SUCCESS;
 }
第三题:
从键盘输入一个字符串,按照字符顺序从小到大进行排序,并要求删除重复
的字符。
void f(char *str) {
 char *p, *q, *r, c;
 for (p = str; *p; p++) {
 for (r = p, q = p + 1; *q; q++)
 if (*r > *q)
 r = q;
 if (r != p) {
 c = *r;
 *r = *p;
 *p = c;
 }
 }
 for (p = str; *p; p++) {
 for (q = p + 1; *q && *q == *p; q++)


 strcpy(p, q--);
 }
 }
 int main() {
 char s[100];
 printf("请输入一个字符串:\n");
 fflush(stdout);
 gets(s);
 f(s);
 printf("结果为:\n%s\n", s);
 return EXIT_SUCCESS;
 }
第四题:
有n 个人围成一个圆圈,顺序排号,从第一个人开始报数(从1 到3 报数),
凡报到3 的人退出圈子,问最后留下的是原来的第几号?
int i, k, m, n, num[50], *p;
 printf("请输入一共有多少人:\n");
 fflush(stdout);
 scanf("%d", &n);
 p = num;
 for (i = 0; i < n; i++)
 *(p + i) = i + 1;
 i = 0;
 k = 0;
 m = 0;
 while (m < n - 1) {
 if ((*(p + i)) != 0) {
 k++;
 }
 if (k == 3) {
 *(p + i) = 0;
 k = 0;
 m++;
 }
 i++;
 if (i == n)
 i = 0;
 }
 while (*p == 0)
 p++;
 printf("最后留下的是原来的第%d号!\n", *p);
第五题:
编写一个函数findstr(char
*str,char *substr),该函数统计一个长度为2 的子字符串在另一个字符串中出
现的次数。
int findStr(char *str, char *substr) {
 int cnt = 0;
 while (*str != '\0') {
 if (*substr != *str) {
 str++;
 continue;
 } else if (*substr == *str) {
 str++;
 substr++;
 if (*substr == *str) {
 cnt++;
 str++;
 substr--;
 } else {
 substr--;
 continue;
 }
 }
 }
 return cnt;
 }


 int main() {
 char str1[100], str2[20], c;
 printf("输入原字符串:\n");
 fflush(stdout);
 gets(str1);
 printf("输入子字符串:\n");
 fflush(stdout);
 gets(str2);
 c = findStr(str1, str2);
 printf("子字符串在原字符串中出现的次数为:\n%d次!\n", c);


 return 0;
 }
第六题:
编写程序实现如下功能:输入一个整数字符串转换为一个整数值,如”1234”
转换为1234,”-1234”转换为-1234。
int main(void) {
 char s[60];
 int n;
 long chnum(char *p);
 printf("输入一个字符串:\n");
 fflush(stdout);
 gets(s);
 if (*s == '-')
 n = -chnum(s + 1);
 else
 n = chnum(s);
 printf("将一个整数字符串转换为一个整数值为:\n%d\n", n);
 return 0;
 }
 long chnum(char *p) {
 long sum = 0;
 while (*p) {
 if (*p >= '0' && *p <= '9')
 sum = sum * 10 + *p - '0';
 p++;
 }
 return sum;
 }
第七题:
void IntPoint(int * s, int * e, int i) {
 while (s != e) {
 *s = i;
 s++;
 }
 *e = i;
 }
 int main() {
 int a[10] = { 0 };
 int i;
 IntPoint(a, a + 9, 10); // 尾指针为 a + 9 ,不是 a + 10
 for (i = 0; i < 10; i++) {
 printf("%d ", a[i]);
 }
 return 0;
 }
第八题:
从键盘输入一个n×n 的二维数组(n 键盘输入),找出此二维数组中各行的
最大值,并按从大到小的次序输出各行的最大值及此值所在的行号
 int main(void)
  {
   int a[80][80],b[80],c[80];//定义b数组保存各行最大值,c数组保存各行行号
   int n,i,j,k=0,l=0,index,max,temp;
   scanf("%d",&n);
   printf("请输入%d阶矩阵:",n);
   for(i=0;i<n;i++)
   for(j=0;j<n;j++)
   scanf("%d",&a[i][j]);
   for(i=0;i<n;i++)
   {
   max=a[i][0];
   for(j=1;j<n;j++)
   if(a[i][j]>max) max=a[i][j];
   b[k++]=max;//记录此行的最大值
   c[l++]=i+1;//记录这时的行号
   }
   for(i=0;i<n-1;i++)//选择排序
   {
   index=i;
   for(j=i+1;j<n;j++)
   if(b[j]>b[index]) index=j;
   if(index==i) continue;
   temp=b[index];
   b[index]=b[i];
   b[i]=temp;
   temp=c[index];//交换最大值时别忘了交换相应的行号
   c[index]=c[i];
   c[i]=temp;
   }
   printf("每行最大数排序后:\n");
   for(i=0;i<n;i++)
   printf("%-4d在第%2d行\n",b[i],c[i]);
     return 0;
  }
第九题:
(2)将reverse函数形参改为采用指针变量形式实现
void reverse(int *p) {
 int t, i, j;
 for (i = 0, j = N - 1; i < j; i++, j--) {
 t = *(p + i);
 *(p + i) = *(p + j);
 *(p + j) = t;
 }
 }


 int main() {
 int i, b[N] = { 98, 76, 68, 65, 57, 53, 45, 43, 32, 29 };


 reverse(b);


 for (i = 0; i < N; i++)
 printf("b[%d]=%d\n", i, b[i]);
 return EXIT_SUCCESS;
 }
(3)在第(2)小题的基础上,保持reverse函数不改动,将主程序中实参改为采用指针变量形式实现
void reverse(int *p)
 {
 int t,i,j;
 for (i=0,j=N-1;i<j;i++,j--)
 {
 t=*(p+i);
 *(p+i)=*(p+j);
 *(p+j)=t;
 }
 }




 int main()
 {
 int i, b[N]={98,76,68,65,57,53,45,43,32,29};
 int *a=b;
 reverse(a); 


 for (i=0;i<N; i++)
 printf("b[%d]=%d\n", i, b[i]);
 return EXIT_SUCCESS;
 }
原创粉丝点击