//利用指针,输入10个数到数组中,再输出
//指针实现数组逆序
//练习:编写函数 replace,在一个字符数组里面查找指定字符,并用相应的字符替代。函数原型如下:
//void replace(char *array, char old, char new, int length)
//练习:编写函数 insert,向一个字符数组指定位置插入一个字符,后面的字符依次向后移动。函数原型如下:
//void insert(char *array, int index, char new, int length)
- 指针基础知识(理解指针概念)
1.已知有以下的说明,
int a[]={8,1,2,5,0,4,7,6,3,9};
那么a[*(a+a[3])]的值为__0_.
2.下列程序运行后的结果为:D
A.10 0 B.0 10 C.10 10 D.以上结果都不对
int main()
{
int a = 10;
int *p,**q;
p = &a;
q = &p;
printf("%d %d",*p,*q);
}
3.若有以下说明和语句,且0<=i<10,则下面哪个是对数组元素的错误引用?C
int a[]={1,2,3,4,5,6,7,8,9,0}, *p, i;
p=a;
A. *(a+i) B. a[p-a] C. p+i D. *(&a[i])
4.若有以下说明和语句,且0<=i<10,则下面哪个是对数组元素地址的正确表示? B
int a[]={1,2,3,4,5,6,7,8,9,0}, *p,i;
p=a;
A. &(a+1) B. a++ C. &p D. &p[i]
5.以下程序的输出结果是哪一项?
#include <stdio.h> D
main()
{ int a[12]={1,2,3,4,5,6,7,8,9,10,11,12}, *p[4],i;
for(i=0;i<4;i++)
p[i]=&a[i*3];
printf("%d\n",*p[3]);
}
A.输出项不合法 B. 4 C. 7 D. 10
6.有以下说明和语句,,则p2-p1的值为多少?(单选)
int a[10], *p1, *p2;
p1=a;
p2=&a[5]; A
A. 5 B. 6 C. 10 D.没有指针与指针的减法
7.若有以下定义和语句:
int s[4][5],(*ps)[5];C
ps=s;
则对s数组元素的正确引用形式是
A) ps+1 B) *(ps+3) C) ps[0][2] D) *(ps+1)+3
8.若有以下的定义,int t[3][2];能正确表示t数组元素地址的表达式是C
A) &t[3][2] B) t[3] C) t[1] D) *t[2]
9.以下程序的输出结果是a= 36_, b= _,16 c= 19 _。
#include <stdio.h>
int func(int a,int *p);
void main()
{ int a=1,b=2,c;
c=func(a,&b); a=1,b=4,c=6;
b=func(c,&a); c=6,a=9,b=16
a=func(b,&c); b=16,c=19,a=36;
printf("a=%d,b=%d,c=%d",a,b,c);
}
int func(int a,int *p)
{ a++;
*p=a+2;
return(*p+a);
}
10.有以下程序
void fun(char *c,int d)
{*c=*c+1;d=d+1;
printf("%c,%c,",*c,d);
}
main()
{char a='A',b='a';
fun(&b,a); printf("%c,%c\n",a,b);
}
程序运行后的输出结果是D。
A) B,a,B,a B) a,B,a,B C) A,b,A,b D) b,B,A,b
11.在说明语句:int *f();中,标识符f代表的是 D
A)一个用于指向整型数据的指针变量
B)一个用于指向一维数组的行指针
C)一个用于指向函数的指针变量
D)一个返回值为指针型的函数名
12.以下程序段给数组所有元素输入数据,应在下划线处添入的是
A)a+(i++) B)&a[i+1] C)a+i D)&a[++i]
main( )
{ int a[10], i=0;
while(i<10) scanf(“%d”,__C___);
……
}
13.以下程序的输出结果是(B)
A)17 B)18 C)19 D)20
main( )
{
int a[ ]={2,4,6,8,10},y=1,x,*p;
p=&a[1];
for (x=0;x<3;x++) y+=*(p+x);
printf(“%d\n”,y);
}
14.下列程序段的输出结果是_______C_____。
int i,x[3][3]={9,8,7,6,5,4,3,2,1},*p=&x[1][1];
for(i=0;i<4;i+=2) C
printf("%d ",*(p+i));
A. 5 2 B. 5 1 C. 5 3 D. 9 7
15、若有函数声明"int sub(int (*x1)(),int *x2);",则形式参数x1是指向____ (4) ____的指针变量。
16.下列程序运行后的结果是:D
A.8 B.9 C.10 D.0
int main()
{
int a[9][4] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
printf("%d\n",**(a+8));======= a[8][0]=0
}
17.下列程序运行后的结果是:D
A.8 B.9 C.10 D.11
int main()
{
int a[9][4] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
int *q;
q = *a;
printf("%d ",*(q+10));
}
18.下列程序运行后的结果是:C
A.3 B.5 C.7 D.9
int main()
{
int a[9][4] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
int (*q)[4];
q = a;
printf("%d ",*(*(q+1)+2));
}
19.下列程序运行后的结果是:C
A.9 B.10 C.11 D.12
int main()
{
int a[9][4] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
printf("%d ",*(*a + 10));
}
20.下面程序在编译或运行结果中会出现什么样的情况 D
A.输出:20 B.输出一个地址
C.编译出错 D.运行后程序异常中止
int main()
{
int *p;
p = 20;
printf("%d ",*p);
}
二.编程题
1.编写函数int atoi(char s[ ]),将字符串s转化为整型数返回。注意负数处理方法。
2.分别编写下列字符串处理函数
(1)char *strcat1(char *s,const char *ct);
将串ct接到串s的后面,形成一个长串。以数组为参数,现用指针为参数。
(2)int strlen1(const char * s);
求字符串长度的函数,返回串长(不包括串结束符)。
(3)char * reverse (char *);
反置字符串s,即可将“break”成为“kaerb”。
(4)char * strchr( const char *cs,char c);
查找字符c在串cs中第一次出现的位置,返回指向该字符的指针,若没有出现则返回NULL。
3.将整数n转换为十进制表示的字符串.
函数格式要如下:char *itoa (int n,char *string);
4.写一个函数,将N*N矩阵转置
5.求峰值,问题描述如下:有一个数组A,找出A中满足大于或小于左右两个元素的元素,首尾两个元素忽略,例如A={12,45,32,0,14,25,62,48,51},则结果为:45,0,62,48
6. 设计函数char *insert(s1,s2,n),用指针实现在字符串s1中的指定位置n处插入字符串s2
7.从键盘上输入10个整数存放到一维数组中,将其中最小的数与第一个数对换,最大的数与最后一个数对换。要求进行数据交换的处理过程编写成一个函数,函数中对数据的处理要用指针方法实现(例如:不能出现a[0] = 4之类的语句)。
8.编写一个函数,函数的功能是移动字符串中的内容。移动的规则如下:把第1到第m个字符,平移到字符串的最后;再把第m+1到最后的字符移动到字符串的前部。例如,字符串中原由的内容为:ABCDEFGHIJK,m的值为3,则移动后,字符串中的内容应该是DEFGHIJKABC。在主函数中输入一个长度不大于20的字符串和平移的值m,调用函数完成字符串的平移。要求用指针方法处理字符串。
9.不使用库函数,实现函数strcmp(char *s1,char *s2)的功能
当s1与s2相等时返回0,否则返回-1
10.使用指针作函数参数,编写用于交换两个参数值的函数。调用该函数用于从键盘输入的两个整数进行交换,交换结果需要在main函数中打印。函数原型为void exchange (int *a,int *b)
Input:x = 100,y = 200
Output:x = 200,y = 100.
11.用指针方法,编写一个函数,求矩阵主对角线元素之和
12.从两个数组的最后一个元素比较两个数组中不同元素的个数,如有s1[5] ={77,21,1,3,5},s2[3] = {1,3,5},从s1[4]与s2[2]开始比较,到s1[2]与s2[0]比较结束。这样得出它们不同元素个数为0,若s1[6] = {77,21,1,3,5,7},那么他们不同元素为3.
函数原型为:void fun(int *s1,int *s2,int *result);
S1与s2表示要比较的数组,result表示返回主函数的比较结果。
13.请编写一个函数,用指针实现将用户输入由数字字符和非数字字符组成的字符串中的数字提取出来,例如输入“asds23rt456,;789sf”,则产生的数字分别是123,456,789.
14.前后颠倒输入的英文中的单词位置,标点符号(只可以出现在句尾)位置不变,如输入“my name is guo hua!”输出应该为“hua guo is name my!”。
15.函数void SumColum(int a[][N],int *sum)的功能是求出M行N列二维数组每列元素中的中的最小值,并计算它们的和值,将和值通过形参传回主函数输出。
16.设有N个人围坐一圈并顺时针方向从1到N编号,从第S个人开始进行1到M报数,报数到第M个人时,此人出圈,再从他的下一个重新开始1到M的报数,如此进行下去直到所有人都出圈为止。现要打印出圈次序。
要求实现函数:
Void fun(int n,int s,int m,int *p)
输入:n游戏总人数 s报数的起始编号 m报数的数值
输出:p指向向度为n的数组,出圈次序保存在p指向的数组中
示例:n = 7,s = 3,m = 3,出圈次序为:4 7 3 1 6 2 5
17.有一个数组int A[nSize],要求写一个函数:
Int *func(int *p,int nSize);将A中的0都移至数组末尾,将非0的移至开始(保持原顺序不变)
例如:
A原来是:1,0,3,4,0,-3,5处理后为:1,3,4,-3,5,0,0
18.请在小于9999的正整数中找符合下列条件的数,它既是完全平方数,又有两位数字相同,如:144,676(此题不必一定用到指针)
19.背包问题:给定n种物品和一个背包,物品i的重量是wi,背包的容量为C。如何选择装入背包的物品,使得背包中重量最大?
例如:设有n=8个体积分别为54,45,43,29,23,21,14,1的物体和一个容积为C=110的背包(最优解:43+23+29+14+1=110)。
程序输出为:43+23+29+14+1=110
20.假如一个算式(算式中都为整数,只有加减法,没有小括号,如果时间充分,可以试试包含加减乘除的四则运算)是一个字符串,请编程得到这个算式的结果
例如算式字符串str = “4+2-4+3”,则结果为5
#include<stdio.h>
//地址: &
//int a 0xfff89900
//指针变量:保存内存地址的变量空间
//int *p char *pstr float *pf
//数据类型+ * +标示符
/*
int main(int argc, const char * argv[])
{
int a=10;
printf("%p\n", &a);
int *p = &a;
printf("%p\n", p);
*p = 20;//*间接寻址符
printf("%d \n", *p);
*(int *)(0x7fff5fbff87c)=30;
printf("%d \n", a);
return 0;
}*/
//64位系统指针变量在内存中占8字节空间
//int main(int argc,const char *argv[])
//{
// printf("%lu\n", sizeof(char *));
// printf("%lu\n", sizeof(int *));
// printf("%lu\n", sizeof(float *));
// printf("%lu\n", sizeof(long *));
//
// return 0;
//}
//int a[6] int (*(&a))[6] int (*)[6]
//
//int main(int argc, const char *argv[])
//{
// int a=10;
// int *p=&a;
// printf("%d \n", *(&a));
// printf("%d \n", *p);
//
// return 0;
//}
#if0
intmain(intargc,constchar*argv[])
{
longa[5]={1,2,3,4,5};
long(*p)[5] = &a;//long (*)[5]
printf("%p\n", p);
p++;
printf("%p\n", p);
// printf("%ld %p\n",*p, p);
// p++;
// printf("%ld %p\n",*p, p);
// p++;
// printf("%ld %p\n",*p, p);
// printf("%p\n", &a[2]);
return0;
}
#endif
//NULL空指针
//(void *)0泛型指针
//#define NULL ((void *)0)
//typedef (void *)0 NULL
//int main(int argc,const char *argv[])
//{
// int a=40;//
// void *p= &a;// int *(&a);
printf("%p\n", p);
printf("%p\n", &p);
p++;
printf("%p\n", p);
//
// *(int *)p = 50;
// printf("%d\n", *(int *)p);
//
// return 0;
//}
intmain(intargc,constchar*argv[])
{
inta=10;
int*p=&a;
*p =40;
printf("%d\n", *p);
return0;
}
//指针运算
//++ --
/*
int main(int argc, const char * argv[])
{
int a=10;
int *p= &a;
printf("%p\n", p);
p++;
printf("%p\n", p);
p--;
printf("%p\n", p);
*p = 20;
printf("%d\n", a);
return 0;
}
*/
//地址相减:地址之差除指针数据类型的长度
//
/*int main(int argc,const char *argv[])
{
int a=10, b=20;
int *p,*q;
p = &a;
q = &b;
printf("p = %p\n", p);
printf("q = %p\n", q);
printf("%lu\n", p-q);//
return 0;
}*/
//int main(int argc, const char *argv[])
//{
// int a[10]={0};
// int *p,*q;
// p = &a[0];
// q = &a[9];
// printf("%ld\n", q-p);
//
// return 0;
//}
/*
int main(int argc,const char *argv[])
{
char str[100]="hello world";
char *pstr = &str[4];
printf("%lu\n", pstr - str +1);
return 0;
}*/
//指针不能进行加法运算
/*
int main(int argc, const char *argv[])
{
int a,b;
int *p,*q;
p = &a;
q= &b;
printf("%p\n", p);
printf("%p\n", q);
//printf("%p\n", p+q);
if (p>q) {
printf("a的地址比b的地址高\n");
}
else
{
printf("b的地址比a的地址高\n");
}
return 0;
}
*/
//指针与函数
/*int findmaxval(int *a, int len)
{
int max = a[0];
for (int i=1; i<len; i++) {
if (max < a[i]) {
max = a[i];
}
}
return max;
}
int main(int argc, const char *argv[])
{
int a[10]={2,3,4,56,3,4,5,6,7,43};
printf("max = %d\n", findmaxval(a, 10));
return 0;
}*/
/*void swap(int a, int b)
{
int temp= a;
a= b;
b = temp;
//printf("a = %d b= %d\n", a, b);
return;
}*/
//void swap(int *p, int *q)
//{
// int temp= *p;
// *p = *q;
// *q = temp;
//}
//
//int main(int argc,const char *argv[])
//{
// int a=10, b=20;
// swap(&a, &b);
// printf("a= %d b = %d\n", a, b);
//
// return 0;
//}
//冒泡排序
//7 6 5 4 3
//6 7 5 4 3
//6 5 7 4 3
//6 5 4 7 3
//6 5 4 3 7
//5 6 4 3 7
//5 4 6 3 7
//5 4 3 6 7
//4 5 3 6 7
//4 3 5 6 7
//3 4 5 6 7
#if0
int* sort_func1(int*arr,intlen)
{
for(inti=0; i<len-1; i++) {
for(intj=0; j<len-1-i; j++) {
if(*(arr+j) > *(arr+j+1)) {
inttemp = *(arr+j);
*(arr+j) = *(arr + j+1);
*(arr + j+1) = temp;
}
}
}
returnarr;
}
intmain(intargc,constchar*argv[])
{
inta[6];
for(inti=0; i<6; i++) {
scanf("%d", &a[i]);
}
sort_func1(a,6);
for(inti=0; i<6; i++) {
printf("%d ", a[i]);
}
printf("\n");
return0;
}
#endif
//选择排序
//6 4 5 3 1
//1 4 5 3 6
//1 3 5 4 6
//1 3 4 5 6
//1 3 4 5 6
#if0
int*sort_func2(int*arr,intlen)
{
//int *p= arr;
/*for (int i=0; i<len-1; i++) {
int k = i;
for (int j=i; j<=len-1; j++) {
if (*(arr+k)>*(arr+j)) {
k= j;
}
}
if (k!=i) {
int temp = *(arr+i);
*(arr+i) = *(arr+k);
*(arr+k) = temp;
}
}
*/
for(inti=0; i<len-1; i++) {
int*p = arr+i;//p保存最小值地址
for(intj=i; j<=len-1; j++) {
if(*p>*(arr+j)) {
p= arr+j;
}
}
if(p!=arr+i) {
inttemp = *(arr+i);
*(arr+i) = *p;
*p = temp;
}
}
returnarr;
}
intmain(intargc,constchar*argv[])
{
inta[6];
for(inti=0; i<6; i++) {
scanf("%d", &a[i]);
}
sort_func2(a,6);
for(inti=0; i<6; i++) {
printf("%d ", a[i]);
}
printf("\n");
return0;
}
#endif
//插入法
//5 3 6 4 1
//3 5 6 4 1
//3 5 6 4 1
//3 4 5 6 1
//1 3 4 5 6
#if0
int*sort_func3(int*arr,intlen)
{
/*for (int i=1; i<len; i++) {
int temp = arr[i];
int j=i-1;
while (arr[j]>temp && j>=0) {
arr[j+1]=arr[j];
j--;
}
arr[j+1]=temp;
}*/
for(inti=1; i<len; i++) {
inttemp = *(arr+i);
intj=i-1;
while(*(arr+j)>temp && j>=0) {
*(arr+j+1)=*(arr+j);
j--;
}
*(arr+j+1)=temp;
}
returnarr;
}
intmain(intargc,constchar*argv[])
{
inta[6];
for(inti=0; i<6; i++) {
scanf("%d", &a[i]);
}
sort_func3(a,6);
for(inti=0; i<6; i++) {
printf("%d ", a[i]);
}
printf("\n");
return0;
}
#endif
//
// int a[10]
//a int *
//int [10] <==> int *
//&a[0] int *
//&a : int (*(&a))[10] int (*)[10]
#if0
intmain(intargc,constchar*argv[])
{
inta[10]={};
int*p = &a[0];
p = a;
int(*q)[10] = &a;
printf("%p\n", a);//int *
printf("%p\n",p);//int *
printf("%p\n",&a);//int (*)[10]
printf("%p\n",q);
return0;
}
#endif
//int a[3][2]
//a: int [3][2] ==> int (*)[2]
//int a[3][2][5]
//a: int [3][2][5] ==> int (*)[2][5]
//int a[3][2]
//&a : int (*(&a))[3][2] ==> int (*)[3][2]
//int a[3][2]
//&a[0]: int a[0][2] ==> int (*&a[0])[2] ==> int (*)[2]
//&a[0][0] int *
//int a[0][2] int *
//a[0] int *
//&a[0]
//int a[0][2] int (*&a[0])[2] int (*)[2]
//&a[0][0] int *
intmain(intargc,constchar*argv[])
{
// int a[3][2][5]={};
// int (*p)[2][5]=a;
// printf("%p\n", p);
inta[3][2]={};
int(*q)[3][2]= &a;
int(*p)[2]=&a[0];
printf("%p\n", p);
printf("%p\n", q);
return0;
}
//
// main.c
//指针深入2
//
// Created by zhangxueming on 14-10-10.
// Copyright (c) 2014年zhangxueming. All rights reserved.
//
#include<stdio.h>
#include<stdio.h>
//数据类型分析
//int a[10]
//a[0]~~~a[9] int
//int *p= &a[0] int (*(&a[0])) ==> int *
//int *p = a; int [10] ==> int *
//&a int a[10] ==> int (*(&a))[10] == > int (*)[10]
/*int main(int argc, const char * argv[])
{
int a[10]={};
int (*p)[10]=&a;
printf("%p\n", p);
p++;
printf("%p\n", p);
return 0;
}*/
//int a[3][5]
//a &a &a[0] &a[0][0] a[0] a[0][0]
//a: int [3][5] ==> int (*)[5]
//&a: int (*(&a))[3][5] == > int (*)[3][5]
//&a[0]: int a[0][5] ==> int (*(&a[0]))[5] ==> int (*)[5]
//&a[0][0]: int *
//a[0]: int a[0][5] ==> int [5] ==> int *
//a[0][0]: int
/*
int main(int argc,const char *argv[])
{
int a[3][5]={};
int (*p)[5] = &a[0];
int (*q)[3][5] = &a;
printf("%p\n", p);
printf("%p\n", q);
return 0;
}*/
//指针的数组
//int *a[10]
//int main(int argc,const char *argv[])
//{
// char *ch[4]={"hello","world","qian","feng"};
//
// for (int i=0; i<4; i++) {
// printf("%s\n",ch[i]);
// }
// //printf("\n");
// return 0;
//}
//指针数组与二维数组
/*int sum_func(int *a[], int len1, int len2)
{
int sum=0;
for (int i=0; i<len1; i++) {
for (int j=0; j<len2; j++) {
sum+= *(*(a+i)+j);
}
}
return sum;
}
int main(int argc,const char *argv[])
{
int a[3][2]={1,2,3,4,5,6};
int *p[3]={NULL};
for (int i=0; i<3; i++) {
p[i]=a[i];
}
printf("sum = %d\n", sum_func(p,3,2));
return 0;
}*/
//数组的指针
//int (*p)[5]
//int (*p)[2][3]
//int (*p)[2][3][4]
/*int main(int argc,const char *argv[])
{
int a[2][3];
int (*p)[2][3] = &a;
//int (*p[5])[2][3]
printf("%p\n", p);
p++;
printf("%p\n", p);
int b[2][3][4];
int (*q)[2][3][4] = &b;
printf("%p\n", q);
q++;
printf("%p\n", q);
return 0;
}*/
//数组的指针与二维数组
//
/*
int sum(int (*p)[2][3])
{
int sum = 0;
for (int i=0; i<2; i++) {
for (int j=0; j<3; j++) {
//sum += (*p)[i][j];
sum += *(*(*p+i)+j);//*p : int (*)[3]
//*(*p+i)+j: ==> int [3]==> int *
}
}
return sum;
}
int sum2(int (*p)[3], int len)
{
int sum=0;
for (int i=0; i<len; i++) {
for (int j=0; j<3; j++) {
sum += *(*(p+i)+j);
}
}
return sum ;
}
int main(int argc,const char *argv[])
{
int a[2][3]={1,2,3,4,5,6};
printf("sum = %d\n", sum(&a));
return 0;
}
*/
//函数的指针
//int (*pfunc)(int, int)
/*int add(int a, int b)
{
return a+b;
}
int multi(int a, int b)
{
return a*b;
}
void print(int cnt)
{
for (int i=0; i<cnt; i++) {
printf("hello world\n");
}
}
int main(int argc,const char *argv[])
{
int (*pfunc)(int, int)= add;
//printf("%d\n", add(10, 20));
printf("%d\n", pfunc(10,20));
pfunc = multi;
printf("%d\n", pfunc(10,20));
void (*qfunc)(int)=print;
qfunc(5);
return 0;
}
*/
//回调函数
void printhello(void)
{
printf("hello\n");
}
voidprintworld(void)
{
printf("world\n");
}
voidprint_welcome(void(*pfunc)(void),inttimes)
{
for(inti=0; i<times; i++) {
pfunc();
}
}
intmain(intargc,constchar*argv[])
{
print_welcome(printhello,5);
print_welcome(printworld,5);
return0;
}
//指针与一维数组
//利用指针,输入10个数到数组中,再输出
//int main(int argc, const char * argv[])
//{
// int a[10];
// int *p=a;
// for (int i=0; i<10; i++) {
// scanf("%d", p);
// p++;
// }
// p=a;
// for (int i=0; i<10; i++) {
// printf("%d ", *p);
// p++;
// }
// printf("\n");
// return 0;
//}
//指针实现数组逆序
/*void reverse_arr(int *a, int len)
{
for (int i=0; i<len/2; i++) {
int temp = *(a+i);
*(a+i)= *(a+len-1-i);
*(a+len-1-i) = temp;
}
}
int main(int argc, const char *argv[])
{
int a[100];
int i,len;
for (i=0; i<100; i++) {
scanf("%d", &a[i]);
if (getchar()=='\n') {
break;
}
}
len = i+1;
reverse_arr(a, len);
for (i = 0; i<len; i++) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}*/
//练习:编写函数replace,在一个字符数组里面查找指定字符,并用相应的字符替代。函数原型如下:
//void replace(char *array, char old, char new, int length)
#include<string.h>
#if0
char* replace(char*array,charold,charnew,intlength)
{
for(inti=0; i<length; i++) {
if(*(array+i)==old) {
*(array+i)= new;
}
}
returnarray;
}
intmain(intargc,constchar*argv[])
{
charstr[100];
scanf("%[^\n]", str);//
printf("%s\n", str);
intlen = (int)strlen(str);
//replace(str, 'a', 'A', len);
printf("%s\n",replace(str,'a','A', len));
/*gets(str);
printf("%s\n", str);
*/
/*scanf("%[A-Z,a-z,0-9]", str);
printf("%s\n", str);
*/
/*scanf("%[abcABC]",str);
printf("%s\n", str);
*/
return0;
}
#endif
//练习:编写函数insert,向一个字符数组指定位置插入一个字符,后面的字符依次向后移动。函数原型如下:
//void insert(char *array, int index, char new, int length)
#if0
voidinsert(char*array,intindex,charnew,intlength)
{
for(inti=length-1; i>=index; i--) {
*(array+i+1)= *(array+i);
}
*(array+index)= new;
}
intmain(intargc,constchar*argv[])
{
charstr[100];
scanf("%[^\n]", str);//
printf("%s\n", str);
intlen = (int)strlen(str);
insert(str,5,'A', len);
printf("%s\n",str);
return0;
}
#endif
//指针常量
//const
//int main(int argc,const char *argv[])
//{
// //char *str="hello world";
// //str = "qianfeng";
// //const char str[100]="hello world";
// char str[100]="hello world";
// *(str+2)='A';
// printf("%s\n", str);
// return 0;
//}
//const+type+变量 type+const+变量
#if0
#define LEN10
intmain(intargc,constchar*argv[])
{
//const int a=10;
intconsta=10;
//a=20;
int*p = &a;
*p =20;
printf("%d\n", a);
printf("%d\n", *p);
printf("%p\n%p\n", &a, p);
printf("%d\n",10);
return0;
}
#endif
//const与*
/*
int main(int argc,const char *argv[])
{
// int a=10;
// int b=20;
// argv[0] = &a;
// const int *p=&a, *q=&b;//*p *q不能被修改, p,q能被修改
// *p = 50;
// *q = 40;
//const int *const p=&a,*q=&b;//*p,p,*q不能被修改, q能被修改
//*p=30;
//p=&b;
//*q = 79;
//q= &a;
// const int *p = &a;// *p不可以修改 p可以被修改
// //*p = 20;
// p= &b;
// printf("%d\n", *p);
// int * const p = &a;//p不可以被修改, *p可以被修改
// *p = 30;
// //p=&b;
// printf("%d\n", *p);
// const int *const p= &a;//*p不能修改, p不能修改
// *p = 90;
// p = &b;
return 0;
}*/
//指针的数组(指针数组)
//指针数组中的每个元素都是一个指针变量
//int *a[10]
//a[0] int *
//int main(int argc, const char *argv[])
//{
// char *ch[5]={"hello one","hello two","hello three","hello four","hello five"};
//
// for (int i=0; i<5; i++) {
// printf("%s\n", ch[i]);
// }
// return 0;
//}
//*(int *) int
//
//int a=20;
//*(int *a) <==> a = 20;
//指针数组与二维数组
/*int sum_func(int *a[], int len)
{
int sum=0;
for (int i=0; i<len; i++) {
//sum += a[0][i];
sum += *(*a+i);// a int ** *a int * **a int
}
return sum;
}*/
//int a[10]
//
//a+1 int
//int **p p int *
//int ***q int **
//int *a[10]
//a+1 int *
//int a[10]
//int *p = a;
//p+1;
//int sum_func(int *a[], int len1, int len2)
//{
// int sum=0;
//
// for (int i=0; i<len1; i++) {
// for (int j=0; j<len2; j++) {
// //sum += a[i][j];
// sum += *(*(a+i)+j);//*a int *
// }
// }
// return sum;
//}
//
//int main(int argc,const char *argv[])
//{
// int a[3][2]={1,2,3,4,5,6};
int a[5]={1,2,3,4,5};
// //printf("%ld\n", sizeof(int **));
// int *p[3]={NULL};
// for (int i=0; i<3; i++) {
// p[i]=a[i];
// }
p[0]=a;
// printf("sum = %d\n",sum_func(p,3,2));
//
// return 0;
//}
//数据类型分析
//int a[10]
//a[0]~~~a[9] int
//int *p= &a[0] int (*(&a[0])) ==> int *
//int *p = a; int [10] ==> int *
//&a int a[10] ==> int (*(&a))[10] == > int (*)[10]
/*int main(int argc, const char * argv[])
{
int a[10]={};
int (*p)[10]=&a;
printf("%p\n", p);
p++;
printf("%p\n", p);
return 0;
}*/
//int a[3][5]
//a &a &a[0] &a[0][0] a[0] a[0][0]
//a: int [3][5] ==> int (*)[5]
//&a: int (*(&a))[3][5] == > int (*)[3][5]
//&a[0]: int a[0][5] ==> int (*(&a[0]))[5] ==> int (*)[5]
//&a[0][0]: int *
//a[0]: int a[0][5] ==> int [5] ==> int *
//a[0][0]: int
/*
int main(int argc,const char *argv[])
{
int a[3][5]={};
int (*p)[5] = &a[0];
int (*q)[3][5] = &a;
printf("%p\n", p);
printf("%p\n", q);
return 0;
}*/
//指针的数组
//int *a[10]
//int main(int argc,const char *argv[])
//{
// char *ch[4]={"hello","world","qian","feng"};
//
// for (int i=0; i<4; i++) {
// printf("%s\n",ch[i]);
// }
// //printf("\n");
// return 0;
//}
//指针数组与二维数组
/*int sum_func(int *a[], int len1, int len2)
{
int sum=0;
for (int i=0; i<len1; i++) {
for (int j=0; j<len2; j++) {
sum+= *(*(a+i)+j);
}
}
return sum;
}
int main(int argc,const char *argv[])
{
int a[3][2]={1,2,3,4,5,6};
int *p[3]={NULL};
for (int i=0; i<3; i++) {
p[i]=a[i];
}
printf("sum = %d\n", sum_func(p,3,2));
return 0;
}*/
//数组的指针
//int (*p)[5]
//int (*p)[2][3]
//int (*p)[2][3][4]
/*int main(int argc,const char *argv[])
{
int a[2][3];
int (*p)[2][3] = &a;
//int (*p[5])[2][3]
printf("%p\n", p);
p++;
printf("%p\n", p);
int b[2][3][4];
int (*q)[2][3][4] = &b;
printf("%p\n", q);
q++;
printf("%p\n", q);
return 0;
}*/
//数组的指针与二维数组
//
#if0
intsum(int(*p)[2][3])
{
intsum =0;
for(inti=0; i<2; i++) {
for(intj=0; j<3; j++) {
//sum += (*p)[i][j];
sum += *(*(*p+i)+j);//*p : int (*)[3]
//*(*p+i)+j: ==> int [3]==> int *
}
}
returnsum;
}
intsum2(int(*p)[3],intlen)
{
intsum=0;
for(inti=0; i<len; i++) {
for(intj=0; j<3; j++) {
sum += *(*(p+i)+j);
}
}
returnsum ;
}
intmain(intargc,constchar*argv[])
{
inta[2][3]={1,2,3,4,5,6};
printf("sum = %d\n", sum(&a));
return0;
}
#endif
//函数的指针
//int (*pfunc)(int, int)
/*int add(int a, int b)
{
return a+b;
}
int multi(int a, int b)
{
return a*b;
}
void print(int cnt)
{
for (int i=0; i<cnt; i++) {
printf("hello world\n");
}
}
int main(int argc,const char *argv[])
{
int (*pfunc)(int, int)= add;
//printf("%d\n", add(10, 20));
printf("%d\n", pfunc(10,20));
pfunc = multi;
printf("%d\n", pfunc(10,20));
void (*qfunc)(int)=print;
qfunc(5);
return 0;
}
*/
//回调函数
/*void printhello(void)
{
printf("hello\n");
}
void printworld(void)
{
printf("world\n");
}
void print_welcome(void(*pfunc)(void), int times)
{
for (int i=0; i<times; i++) {
pfunc();
}
}
int main(int argc,const char *argv[])
{
print_welcome(printhello, 5);
print_welcome(printworld, 5);
return 0;
}
*/
//
#include<string.h>
//strncpy()
#if0
intcompare_int(int*a,int*b)// >0
{
return*a-*b;
}
voidsort_int(int*a,intlen,int(*pfunc)(int*,int*))
//void sort_int(int *a, int len)
{
int*p_i=NULL,*p_j=NULL;
p_i=a;
for(inti=0; i<len-1; i++)
{
p_j = p_i+1;
for(intj=0; j<len-i-1; j++)
{
/*if (pfunc(&a[j],&a[j+1])>0) {
int temp = a[j];
a[j]=a[j+1];
a[j+1]=temp;
}*/
if(pfunc(p_i,p_j)>0)
{
inttemp = *p_i;
*p_i = *p_j;
*p_j = temp;
}
p_j++;
}
p_i++;
}
}
intmain(intargc,constchar*argv[])
{
inta[5];
for(inti=0; i<5; i++) {
scanf("%d", &a[i]);
}
sort_int(a,5,compare_int);
for(inti=0; i<5; i++) {
printf("%d ", a[i]);
}
printf("\n");
return0;
}
#endif
#if0
#include<math.h>
intcompare_int(void*a,void*b)
{
return*(int*)a - *(int*)b;
}
intcompare_char(void*ch1,void*ch2)
{
return*(char*)ch1-*(char*)ch2;
}
intcompare_float(void*a,void*b)
{
floatval = *(float*)a - *(float*)b;
if(fabs(val) <0.00005)//精度问题
return0;
elseif(val>0.0)
return1;
else
return-1;
}
voidsort(void*a,intlen,intsize,int(*pfunc)(void*,void*))
{
charbuf[size+1];
char*p_i=NULL,*p_j=NULL;
p_i = (char*)a;
//printf("%.2f\n", *(float *)p_i);
for(inti=0; i<len-1; i++)
{
p_j=p_i;
for(intj=0; j<len-i-1; j++)
{
p_j+=size;
if(pfunc(p_i,p_j)>0) {
memcpy(buf, p_i, size);//选择排序
memcpy(p_i, p_j, size);
memcpy(p_j, buf, size);
}
}
p_i+=size;
}
}
intmain(intargc,constchar*argv[])
{
// int a[5]={7,4,6,3,1};
// for (int i=0; i<5; i++) {
// scanf("%d",&a[i]);
// }
// //sort_int(a, 5);
// sort(a, 5, sizeof(int), compare_int);
// for (int i=0; i<5; i++) {
// printf("%d ", a[i]);
// }
// float a[5]={89.9,56.5,67.32,23.12,34.2};
for (int i=0; i<5; i++) {
scanf("%f",&a[i]);
}
// sort(a, 5, sizeof(float), compare_float);
// for (int i=0; i<5; i++) {
// printf("%.2f ",a[i]);
// }
charstr[]="helloworld";
sort(str,(int)strlen(str),sizeof(char), compare_char);
printf("%s\n", str);
printf("\n");
return0;
}
#endif
//int main(int argc,const char *argv[])
//{
// double a[5]={8.9,56.5,67.32,23.12,34.2};
// sort(compar_double, a, 5, sizeof(double));
// for (int i=0; i<5; i++)
// {
// printf("%.2f ",a[i]);
// }
// printf("\n");
//}
//二级指针
//int a
//int *p = &a
//int **q = &p
//int main(int argc,const char *argv[])
//{
// int a=5;
// int *p = &a;
// int **q = &p;
//
// printf("%p\n", q);
// printf("%p\n", &p);
//
// printf("%p\n", *q);
// printf("%p\n", &a);
//
// printf("%d\n", **q);
// printf("%d\n", *p);
//
// return 0;
//}
//void swap(int **a, int **b)
//{
// int temp = **a;
// **a = **b;
// **b = temp;
//}
//
//int main(int argc,const char *argv[])
//{
// int a=10, b=20;
// int *p= &a, *q = &b;
// swap(&p, &q);
// printf("%d %d\n", a, b);
//}
//char *strncpy(char *, const char *, size_t);
//int main(int argc,const char *argv[])
//{
// char str1[100]={};
// char str2[50]="hello world";
//
// str2[14]='A';
//
// strncpy(str1, str2, 20);
// //memcpy(str1, str2, 20);
// //printf("%s\n",str1);
// for (int i=0; i<20; i++) {
// printf("%c",str1[i]);
// }
// printf("\n");
// return 0;
//}
//练习
//定义一个一维字符指针数组,并利用不定数量(不多于10)个字符串将其初始化,然后将各字符串输出。
//比如:
//输入
//asdfw uuio fff tyu
//
//输出为
//tyu
//fff
//uuio
//asdfw
//int main(int argc,const char *argv[])
//{
// char *pstr[10]={NULL};
// char a[10][50]={};
// int cnt=0;
// for (int i=0; i<10; i++) {
// pstr[i]=a[i];
// }
//
// for (int i=0; i<10; i++) {
// scanf("%s", pstr[i]);
// cnt++;
// if (getchar()=='\n') {
// break;
// }
// }
//
// for (int i=cnt-1; i>=0; i--) {
// printf("%s\n",pstr[i]);
// }
// printf("\n");
// return 0;
//}
#include<stdlib.h>
//
//int main(int argc, const char *argv[])
//{
// char *pstr[10]={NULL};
// int cnt=0;
// for (int i=0; i<10; i++) {
// pstr[i]= (char *)malloc(100*sizeof(char));
// scanf("%s",pstr[i]);
// cnt++;
// if (getchar()=='\n') {
// break;
// }
// }
//
// for (int i=cnt-1; i>=0; i--) {
// printf("%s\n", pstr[i]);
// }
// printf("\n");
//
// return 0;
//}//实现一个函数,传递两个字符数组,利用指针将第二个数组中的字符,拼接到第一个字符数组尾部,并在main函数里输出。
//比如:
//输入:
//hello
//world
//输出:helloworld
//int main(int argc, const char *argv[])
//{
// char str1[50]={};
// char str2[20]={};
// scanf("%s%s",str1,str2);
//
// int len1 = (int)strlen(str1);
// int len2 = (int)strlen(str2);
// for (int i=0;i<len2;i++) {
// str1[i+len1]= str2[i];
// }
// str1[len1+len2]='\0';
// printf("%s\n", str1);
// return 0;
//}
//atoi
//int atoi(const char *);
//int main(int argc,const char *argv[])
//{
// char str[100]={};
// scanf("%s",str);
// printf("%d\n",atoi(str));
// return 0;
//}
intmain(intargc,constchar*argv[])
{
inta[11]={};
inttemp;
for(inti=0; i<10;i++) {
scanf("%d",&a[i]);
}
scanf("%d",&temp);
for(inti=9; i>=0; i--) {
if(a[i]>temp) {
a[i+1]=a[i];
}
else
{
a[i+1]=temp;
break;
}
}
for(inti=0; i<11; i++) {
printf("%d ", a[i]);
}
printf("\n");
return0;
}
#include<stdio.h>
//地址: &
//int a 0xfff89900
//指针变量:保存内存地址的变量空间
//int *p char *pstr float *pf
//数据类型+ * +标示符
/*
int main(int argc, const char * argv[])
{
int a=10;
printf("%p\n", &a);
int *p = &a;
printf("%p\n", p);
*p = 20;//*间接寻址符
printf("%d \n", *p);
*(int *)(0x7fff5fbff87c)=30;
printf("%d \n", a);
return 0;
}*/
//64位系统指针变量在内存中占8字节空间
//int main(int argc,const char *argv[])
//{
// printf("%lu\n", sizeof(char *));
// printf("%lu\n", sizeof(int *));
// printf("%lu\n", sizeof(float *));
// printf("%lu\n", sizeof(long *));
//
// return 0;
//}
//int a[6] int (*(&a))[6] int (*)[6]
//
//int main(int argc, const char *argv[])
//{
// int a=10;
// int *p=&a;
// printf("%d \n", *(&a));
// printf("%d \n", *p);
//
// return 0;
//}
#if0
intmain(intargc,constchar*argv[])
{
longa[5]={1,2,3,4,5};
long(*p)[5] = &a;//long (*)[5]
printf("%p\n", p);
p++;
printf("%p\n", p);
// printf("%ld %p\n",*p, p);
// p++;
// printf("%ld %p\n",*p, p);
// p++;
// printf("%ld %p\n",*p, p);
// printf("%p\n", &a[2]);
return0;
}
#endif
//NULL空指针
//(void *)0泛型指针
//#define NULL ((void *)0)
//typedef (void *)0 NULL
//int main(int argc,const char *argv[])
//{
// int a=40;//
// void *p= &a;// int *(&a);
printf("%p\n", p);
printf("%p\n", &p);
p++;
printf("%p\n", p);
//
// *(int *)p = 50;
// printf("%d\n", *(int *)p);
//
// return 0;
//}
intmain(intargc,constchar*argv[])
{
inta=10;
int*p=&a;
*p =40;
printf("%d\n", *p);
return0;
}
//指针运算
//++ --
/*
int main(int argc, const char * argv[])
{
int a=10;
int *p= &a;
printf("%p\n", p);
p++;
printf("%p\n", p);
p--;
printf("%p\n", p);
*p = 20;
printf("%d\n", a);
return 0;
}
*/
//地址相减:地址之差除指针数据类型的长度
//
/*int main(int argc,const char *argv[])
{
int a=10, b=20;
int *p,*q;
p = &a;
q = &b;
printf("p = %p\n", p);
printf("q = %p\n", q);
printf("%lu\n", p-q);//
return 0;
}*/
//int main(int argc, const char *argv[])
//{
// int a[10]={0};
// int *p,*q;
// p = &a[0];
// q = &a[9];
// printf("%ld\n", q-p);
//
// return 0;
//}
/*
int main(int argc,const char *argv[])
{
char str[100]="hello world";
char *pstr = &str[4];
printf("%lu\n", pstr - str +1);
return 0;
}*/
//指针不能进行加法运算
/*
int main(int argc, const char *argv[])
{
int a,b;
int *p,*q;
p = &a;
q= &b;
printf("%p\n", p);
printf("%p\n", q);
//printf("%p\n", p+q);
if (p>q) {
printf("a的地址比b的地址高\n");
}
else
{
printf("b的地址比a的地址高\n");
}
return 0;
}
*/
//指针与函数
/*int findmaxval(int *a, int len)
{
int max = a[0];
for (int i=1; i<len; i++) {
if (max < a[i]) {
max = a[i];
}
}
return max;
}
int main(int argc, const char *argv[])
{
int a[10]={2,3,4,56,3,4,5,6,7,43};
printf("max = %d\n", findmaxval(a, 10));
return 0;
}*/
/*void swap(int a, int b)
{
int temp= a;
a= b;
b = temp;
//printf("a = %d b= %d\n", a, b);
return;
}*/
//void swap(int *p, int *q)
//{
// int temp= *p;
// *p = *q;
// *q = temp;
//}
//
//int main(int argc,const char *argv[])
//{
// int a=10, b=20;
// swap(&a, &b);
// printf("a= %d b = %d\n", a, b);
//
// return 0;
//}
//冒泡排序
//7 6 5 4 3
//6 7 5 4 3
//6 5 7 4 3
//6 5 4 7 3
//6 5 4 3 7
//5 6 4 3 7
//5 4 6 3 7
//5 4 3 6 7
//4 5 3 6 7
//4 3 5 6 7
//3 4 5 6 7
#if0
int* sort_func1(int*arr,intlen)
{
for(inti=0; i<len-1; i++) {
for(intj=0; j<len-1-i; j++) {
if(*(arr+j) > *(arr+j+1)) {
inttemp = *(arr+j);
*(arr+j) = *(arr + j+1);
*(arr + j+1) = temp;
}
}
}
returnarr;
}
intmain(intargc,constchar*argv[])
{
inta[6];
for(inti=0; i<6; i++) {
scanf("%d", &a[i]);
}
sort_func1(a,6);
for(inti=0; i<6; i++) {
printf("%d ", a[i]);
}
printf("\n");
return0;
}
#endif
//选择排序
//6 4 5 3 1
//1 4 5 3 6
//1 3 5 4 6
//1 3 4 5 6
//1 3 4 5 6
#if0
int*sort_func2(int*arr,intlen)
{
//int *p= arr;
/*for (int i=0; i<len-1; i++) {
int k = i;
for (int j=i; j<=len-1; j++) {
if (*(arr+k)>*(arr+j)) {
k= j;
}
}
if (k!=i) {
int temp = *(arr+i);
*(arr+i) = *(arr+k);
*(arr+k) = temp;
}
}
*/
for(inti=0; i<len-1; i++) {
int*p = arr+i;//p保存最小值地址
for(intj=i; j<=len-1; j++) {
if(*p>*(arr+j)) {
p= arr+j;
}
}
if(p!=arr+i) {
inttemp = *(arr+i);
*(arr+i) = *p;
*p = temp;
}
}
returnarr;
}
intmain(intargc,constchar*argv[])
{
inta[6];
for(inti=0; i<6; i++) {
scanf("%d", &a[i]);
}
sort_func2(a,6);
for(inti=0; i<6; i++) {
printf("%d ", a[i]);
}
printf("\n");
return0;
}
#endif
//插入法
//5 3 6 4 1
//3 5 6 4 1
//3 5 6 4 1
//3 4 5 6 1
//1 3 4 5 6
#if0
int*sort_func3(int*arr,intlen)
{
/*for (int i=1; i<len; i++) {
int temp = arr[i];
int j=i-1;
while (arr[j]>temp && j>=0) {
arr[j+1]=arr[j];
j--;
}
arr[j+1]=temp;
}*/
for(inti=1; i<len; i++) {
inttemp = *(arr+i);
intj=i-1;
while(*(arr+j)>temp && j>=0) {
*(arr+j+1)=*(arr+j);
j--;
}
*(arr+j+1)=temp;
}
returnarr;
}
intmain(intargc,constchar*argv[])
{
inta[6];
for(inti=0; i<6; i++) {
scanf("%d", &a[i]);
}
sort_func3(a,6);
for(inti=0; i<6; i++) {
printf("%d ", a[i]);
}
printf("\n");
return0;
}
#endif
//
// int a[10]
//a int *
//int [10] <==> int *
//&a[0] int *
//&a : int (*(&a))[10] int (*)[10]
#if0
intmain(intargc,constchar*argv[])
{
inta[10]={};
int*p = &a[0];
p = a;
int(*q)[10] = &a;
printf("%p\n", a);//int *
printf("%p\n",p);//int *
printf("%p\n",&a);//int (*)[10]
printf("%p\n",q);
return0;
}
#endif
//int a[3][2]
//a: int [3][2] ==> int (*)[2]
//int a[3][2][5]
//a: int [3][2][5] ==> int (*)[2][5]
//int a[3][2]
//&a : int (*(&a))[3][2] ==> int (*)[3][2]
//int a[3][2]
//&a[0]: int a[0][2] ==> int (*&a[0])[2] ==> int (*)[2]
//&a[0][0] int *
//int a[0][2] int *
//a[0] int *
//&a[0]
//int a[0][2] int (*&a[0])[2] int (*)[2]
//&a[0][0] int *
intmain(intargc,constchar*argv[])
{
// int a[3][2][5]={};
// int (*p)[2][5]=a;
// printf("%p\n", p);
inta[3][2]={};
int(*q)[3][2]= &a;
int(*p)[2]=&a[0];
printf("%p\n", p);
printf("%p\n", q);
return0;
}
//
// main.c
//指针深入2
//
// Created by zhangxueming on 14-10-10.
// Copyright (c) 2014年zhangxueming. All rights reserved.
//
#include<stdio.h>
#include<stdio.h>
//数据类型分析
//int a[10]
//a[0]~~~a[9] int
//int *p= &a[0] int (*(&a[0])) ==> int *
//int *p = a; int [10] ==> int *
//&a int a[10] ==> int (*(&a))[10] == > int (*)[10]
/*int main(int argc, const char * argv[])
{
int a[10]={};
int (*p)[10]=&a;
printf("%p\n", p);
p++;
printf("%p\n", p);
return 0;
}*/
//int a[3][5]
//a &a &a[0] &a[0][0] a[0] a[0][0]
//a: int [3][5] ==> int (*)[5]
//&a: int (*(&a))[3][5] == > int (*)[3][5]
//&a[0]: int a[0][5] ==> int (*(&a[0]))[5] ==> int (*)[5]
//&a[0][0]: int *
//a[0]: int a[0][5] ==> int [5] ==> int *
//a[0][0]: int
/*
int main(int argc,const char *argv[])
{
int a[3][5]={};
int (*p)[5] = &a[0];
int (*q)[3][5] = &a;
printf("%p\n", p);
printf("%p\n", q);
return 0;
}*/
//指针的数组
//int *a[10]
//int main(int argc,const char *argv[])
//{
// char *ch[4]={"hello","world","qian","feng"};
//
// for (int i=0; i<4; i++) {
// printf("%s\n",ch[i]);
// }
// //printf("\n");
// return 0;
//}
//指针数组与二维数组
/*int sum_func(int *a[], int len1, int len2)
{
int sum=0;
for (int i=0; i<len1; i++) {
for (int j=0; j<len2; j++) {
sum+= *(*(a+i)+j);
}
}
return sum;
}
int main(int argc,const char *argv[])
{
int a[3][2]={1,2,3,4,5,6};
int *p[3]={NULL};
for (int i=0; i<3; i++) {
p[i]=a[i];
}
printf("sum = %d\n", sum_func(p,3,2));
return 0;
}*/
//数组的指针
//int (*p)[5]
//int (*p)[2][3]
//int (*p)[2][3][4]
/*int main(int argc,const char *argv[])
{
int a[2][3];
int (*p)[2][3] = &a;
//int (*p[5])[2][3]
printf("%p\n", p);
p++;
printf("%p\n", p);
int b[2][3][4];
int (*q)[2][3][4] = &b;
printf("%p\n", q);
q++;
printf("%p\n", q);
return 0;
}*/
//数组的指针与二维数组
//
/*
int sum(int (*p)[2][3])
{
int sum = 0;
for (int i=0; i<2; i++) {
for (int j=0; j<3; j++) {
//sum += (*p)[i][j];
sum += *(*(*p+i)+j);//*p : int (*)[3]
//*(*p+i)+j: ==> int [3]==> int *
}
}
return sum;
}
int sum2(int (*p)[3], int len)
{
int sum=0;
for (int i=0; i<len; i++) {
for (int j=0; j<3; j++) {
sum += *(*(p+i)+j);
}
}
return sum ;
}
int main(int argc,const char *argv[])
{
int a[2][3]={1,2,3,4,5,6};
printf("sum = %d\n", sum(&a));
return 0;
}
*/
//函数的指针
//int (*pfunc)(int, int)
/*int add(int a, int b)
{
return a+b;
}
int multi(int a, int b)
{
return a*b;
}
void print(int cnt)
{
for (int i=0; i<cnt; i++) {
printf("hello world\n");
}
}
int main(int argc,const char *argv[])
{
int (*pfunc)(int, int)= add;
//printf("%d\n", add(10, 20));
printf("%d\n", pfunc(10,20));
pfunc = multi;
printf("%d\n", pfunc(10,20));
void (*qfunc)(int)=print;
qfunc(5);
return 0;
}
*/
//回调函数
void printhello(void)
{
printf("hello\n");
}
voidprintworld(void)
{
printf("world\n");
}
voidprint_welcome(void(*pfunc)(void),inttimes)
{
for(inti=0; i<times; i++) {
pfunc();
}
}
intmain(intargc,constchar*argv[])
{
print_welcome(printhello,5);
print_welcome(printworld,5);
return0;
}
//指针与一维数组
//利用指针,输入10个数到数组中,再输出
//int main(int argc, const char * argv[])
//{
// int a[10];
// int *p=a;
// for (int i=0; i<10; i++) {
// scanf("%d", p);
// p++;
// }
// p=a;
// for (int i=0; i<10; i++) {
// printf("%d ", *p);
// p++;
// }
// printf("\n");
// return 0;
//}
//指针实现数组逆序
/*void reverse_arr(int *a, int len)
{
for (int i=0; i<len/2; i++) {
int temp = *(a+i);
*(a+i)= *(a+len-1-i);
*(a+len-1-i) = temp;
}
}
int main(int argc, const char *argv[])
{
int a[100];
int i,len;
for (i=0; i<100; i++) {
scanf("%d", &a[i]);
if (getchar()=='\n') {
break;
}
}
len = i+1;
reverse_arr(a, len);
for (i = 0; i<len; i++) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}*/
//练习:编写函数replace,在一个字符数组里面查找指定字符,并用相应的字符替代。函数原型如下:
//void replace(char *array, char old, char new, int length)
#include<string.h>
#if0
char* replace(char*array,charold,charnew,intlength)
{
for(inti=0; i<length; i++) {
if(*(array+i)==old) {
*(array+i)= new;
}
}
returnarray;
}
intmain(intargc,constchar*argv[])
{
charstr[100];
scanf("%[^\n]", str);//
printf("%s\n", str);
intlen = (int)strlen(str);
//replace(str, 'a', 'A', len);
printf("%s\n",replace(str,'a','A', len));
/*gets(str);
printf("%s\n", str);
*/
/*scanf("%[A-Z,a-z,0-9]", str);
printf("%s\n", str);
*/
/*scanf("%[abcABC]",str);
printf("%s\n", str);
*/
return0;
}
#endif
//练习:编写函数insert,向一个字符数组指定位置插入一个字符,后面的字符依次向后移动。函数原型如下:
//void insert(char *array, int index, char new, int length)
#if0
voidinsert(char*array,intindex,charnew,intlength)
{
for(inti=length-1; i>=index; i--) {
*(array+i+1)= *(array+i);
}
*(array+index)= new;
}
intmain(intargc,constchar*argv[])
{
charstr[100];
scanf("%[^\n]", str);//
printf("%s\n", str);
intlen = (int)strlen(str);
insert(str,5,'A', len);
printf("%s\n",str);
return0;
}
#endif
//指针常量
//const
//int main(int argc,const char *argv[])
//{
// //char *str="hello world";
// //str = "qianfeng";
// //const char str[100]="hello world";
// char str[100]="hello world";
// *(str+2)='A';
// printf("%s\n", str);
// return 0;
//}
//const+type+变量 type+const+变量
#if0
#define LEN10
intmain(intargc,constchar*argv[])
{
//const int a=10;
intconsta=10;
//a=20;
int*p = &a;
*p =20;
printf("%d\n", a);
printf("%d\n", *p);
printf("%p\n%p\n", &a, p);
printf("%d\n",10);
return0;
}
#endif
//const与*
/*
int main(int argc,const char *argv[])
{
// int a=10;
// int b=20;
// argv[0] = &a;
// const int *p=&a, *q=&b;//*p *q不能被修改, p,q能被修改
// *p = 50;
// *q = 40;
//const int *const p=&a,*q=&b;//*p,p,*q不能被修改, q能被修改
//*p=30;
//p=&b;
//*q = 79;
//q= &a;
// const int *p = &a;// *p不可以修改 p可以被修改
// //*p = 20;
// p= &b;
// printf("%d\n", *p);
// int * const p = &a;//p不可以被修改, *p可以被修改
// *p = 30;
// //p=&b;
// printf("%d\n", *p);
// const int *const p= &a;//*p不能修改, p不能修改
// *p = 90;
// p = &b;
return 0;
}*/
//指针的数组(指针数组)
//指针数组中的每个元素都是一个指针变量
//int *a[10]
//a[0] int *
//int main(int argc, const char *argv[])
//{
// char *ch[5]={"hello one","hello two","hello three","hello four","hello five"};
//
// for (int i=0; i<5; i++) {
// printf("%s\n", ch[i]);
// }
// return 0;
//}
//*(int *) int
//
//int a=20;
//*(int *a) <==> a = 20;
//指针数组与二维数组
/*int sum_func(int *a[], int len)
{
int sum=0;
for (int i=0; i<len; i++) {
//sum += a[0][i];
sum += *(*a+i);// a int ** *a int * **a int
}
return sum;
}*/
//int a[10]
//
//a+1 int
//int **p p int *
//int ***q int **
//int *a[10]
//a+1 int *
//int a[10]
//int *p = a;
//p+1;
//int sum_func(int *a[], int len1, int len2)
//{
// int sum=0;
//
// for (int i=0; i<len1; i++) {
// for (int j=0; j<len2; j++) {
// //sum += a[i][j];
// sum += *(*(a+i)+j);//*a int *
// }
// }
// return sum;
//}
//
//int main(int argc,const char *argv[])
//{
// int a[3][2]={1,2,3,4,5,6};
int a[5]={1,2,3,4,5};
// //printf("%ld\n", sizeof(int **));
// int *p[3]={NULL};
// for (int i=0; i<3; i++) {
// p[i]=a[i];
// }
p[0]=a;
// printf("sum = %d\n",sum_func(p,3,2));
//
// return 0;
//}
//数据类型分析
//int a[10]
//a[0]~~~a[9] int
//int *p= &a[0] int (*(&a[0])) ==> int *
//int *p = a; int [10] ==> int *
//&a int a[10] ==> int (*(&a))[10] == > int (*)[10]
/*int main(int argc, const char * argv[])
{
int a[10]={};
int (*p)[10]=&a;
printf("%p\n", p);
p++;
printf("%p\n", p);
return 0;
}*/
//int a[3][5]
//a &a &a[0] &a[0][0] a[0] a[0][0]
//a: int [3][5] ==> int (*)[5]
//&a: int (*(&a))[3][5] == > int (*)[3][5]
//&a[0]: int a[0][5] ==> int (*(&a[0]))[5] ==> int (*)[5]
//&a[0][0]: int *
//a[0]: int a[0][5] ==> int [5] ==> int *
//a[0][0]: int
/*
int main(int argc,const char *argv[])
{
int a[3][5]={};
int (*p)[5] = &a[0];
int (*q)[3][5] = &a;
printf("%p\n", p);
printf("%p\n", q);
return 0;
}*/
//指针的数组
//int *a[10]
//int main(int argc,const char *argv[])
//{
// char *ch[4]={"hello","world","qian","feng"};
//
// for (int i=0; i<4; i++) {
// printf("%s\n",ch[i]);
// }
// //printf("\n");
// return 0;
//}
//指针数组与二维数组
/*int sum_func(int *a[], int len1, int len2)
{
int sum=0;
for (int i=0; i<len1; i++) {
for (int j=0; j<len2; j++) {
sum+= *(*(a+i)+j);
}
}
return sum;
}
int main(int argc,const char *argv[])
{
int a[3][2]={1,2,3,4,5,6};
int *p[3]={NULL};
for (int i=0; i<3; i++) {
p[i]=a[i];
}
printf("sum = %d\n", sum_func(p,3,2));
return 0;
}*/
//数组的指针
//int (*p)[5]
//int (*p)[2][3]
//int (*p)[2][3][4]
/*int main(int argc,const char *argv[])
{
int a[2][3];
int (*p)[2][3] = &a;
//int (*p[5])[2][3]
printf("%p\n", p);
p++;
printf("%p\n", p);
int b[2][3][4];
int (*q)[2][3][4] = &b;
printf("%p\n", q);
q++;
printf("%p\n", q);
return 0;
}*/
//数组的指针与二维数组
//
#if0
intsum(int(*p)[2][3])
{
intsum =0;
for(inti=0; i<2; i++) {
for(intj=0; j<3; j++) {
//sum += (*p)[i][j];
sum += *(*(*p+i)+j);//*p : int (*)[3]
//*(*p+i)+j: ==> int [3]==> int *
}
}
returnsum;
}
intsum2(int(*p)[3],intlen)
{
intsum=0;
for(inti=0; i<len; i++) {
for(intj=0; j<3; j++) {
sum += *(*(p+i)+j);
}
}
returnsum ;
}
intmain(intargc,constchar*argv[])
{
inta[2][3]={1,2,3,4,5,6};
printf("sum = %d\n", sum(&a));
return0;
}
#endif
//函数的指针
//int (*pfunc)(int, int)
/*int add(int a, int b)
{
return a+b;
}
int multi(int a, int b)
{
return a*b;
}
void print(int cnt)
{
for (int i=0; i<cnt; i++) {
printf("hello world\n");
}
}
int main(int argc,const char *argv[])
{
int (*pfunc)(int, int)= add;
//printf("%d\n", add(10, 20));
printf("%d\n", pfunc(10,20));
pfunc = multi;
printf("%d\n", pfunc(10,20));
void (*qfunc)(int)=print;
qfunc(5);
return 0;
}
*/
//回调函数
/*void printhello(void)
{
printf("hello\n");
}
void printworld(void)
{
printf("world\n");
}
void print_welcome(void(*pfunc)(void), int times)
{
for (int i=0; i<times; i++) {
pfunc();
}
}
int main(int argc,const char *argv[])
{
print_welcome(printhello, 5);
print_welcome(printworld, 5);
return 0;
}
*/
//
#include<string.h>
//strncpy()
#if0
intcompare_int(int*a,int*b)// >0
{
return*a-*b;
}
voidsort_int(int*a,intlen,int(*pfunc)(int*,int*))
//void sort_int(int *a, int len)
{
int*p_i=NULL,*p_j=NULL;
p_i=a;
for(inti=0; i<len-1; i++)
{
p_j = p_i+1;
for(intj=0; j<len-i-1; j++)
{
/*if (pfunc(&a[j],&a[j+1])>0) {
int temp = a[j];
a[j]=a[j+1];
a[j+1]=temp;
}*/
if(pfunc(p_i,p_j)>0)
{
inttemp = *p_i;
*p_i = *p_j;
*p_j = temp;
}
p_j++;
}
p_i++;
}
}
intmain(intargc,constchar*argv[])
{
inta[5];
for(inti=0; i<5; i++) {
scanf("%d", &a[i]);
}
sort_int(a,5,compare_int);
for(inti=0; i<5; i++) {
printf("%d ", a[i]);
}
printf("\n");
return0;
}
#endif
#if0
#include<math.h>
intcompare_int(void*a,void*b)
{
return*(int*)a - *(int*)b;
}
intcompare_char(void*ch1,void*ch2)
{
return*(char*)ch1-*(char*)ch2;
}
intcompare_float(void*a,void*b)
{
floatval = *(float*)a - *(float*)b;
if(fabs(val) <0.00005)//精度问题
return0;
elseif(val>0.0)
return1;
else
return-1;
}
voidsort(void*a,intlen,intsize,int(*pfunc)(void*,void*))
{
charbuf[size+1];
char*p_i=NULL,*p_j=NULL;
p_i = (char*)a;
//printf("%.2f\n", *(float *)p_i);
for(inti=0; i<len-1; i++)
{
p_j=p_i;
for(intj=0; j<len-i-1; j++)
{
p_j+=size;
if(pfunc(p_i,p_j)>0) {
memcpy(buf, p_i, size);//选择排序
memcpy(p_i, p_j, size);
memcpy(p_j, buf, size);
}
}
p_i+=size;
}
}
intmain(intargc,constchar*argv[])
{
// int a[5]={7,4,6,3,1};
// for (int i=0; i<5; i++) {
// scanf("%d",&a[i]);
// }
// //sort_int(a, 5);
// sort(a, 5, sizeof(int), compare_int);
// for (int i=0; i<5; i++) {
// printf("%d ", a[i]);
// }
// float a[5]={89.9,56.5,67.32,23.12,34.2};
for (int i=0; i<5; i++) {
scanf("%f",&a[i]);
}
// sort(a, 5, sizeof(float), compare_float);
// for (int i=0; i<5; i++) {
// printf("%.2f ",a[i]);
// }
charstr[]="helloworld";
sort(str,(int)strlen(str),sizeof(char), compare_char);
printf("%s\n", str);
printf("\n");
return0;
}
#endif
//int main(int argc,const char *argv[])
//{
// double a[5]={8.9,56.5,67.32,23.12,34.2};
// sort(compar_double, a, 5, sizeof(double));
// for (int i=0; i<5; i++)
// {
// printf("%.2f ",a[i]);
// }
// printf("\n");
//}
//二级指针
//int a
//int *p = &a
//int **q = &p
//int main(int argc,const char *argv[])
//{
// int a=5;
// int *p = &a;
// int **q = &p;
//
// printf("%p\n", q);
// printf("%p\n", &p);
//
// printf("%p\n", *q);
// printf("%p\n", &a);
//
// printf("%d\n", **q);
// printf("%d\n", *p);
//
// return 0;
//}
//void swap(int **a, int **b)
//{
// int temp = **a;
// **a = **b;
// **b = temp;
//}
//
//int main(int argc,const char *argv[])
//{
// int a=10, b=20;
// int *p= &a, *q = &b;
// swap(&p, &q);
// printf("%d %d\n", a, b);
//}
//char *strncpy(char *, const char *, size_t);
//int main(int argc,const char *argv[])
//{
// char str1[100]={};
// char str2[50]="hello world";
//
// str2[14]='A';
//
// strncpy(str1, str2, 20);
// //memcpy(str1, str2, 20);
// //printf("%s\n",str1);
// for (int i=0; i<20; i++) {
// printf("%c",str1[i]);
// }
// printf("\n");
// return 0;
//}
//练习
//定义一个一维字符指针数组,并利用不定数量(不多于10)个字符串将其初始化,然后将各字符串输出。
//比如:
//输入
//asdfw uuio fff tyu
//
//输出为
//tyu
//fff
//uuio
//asdfw
//int main(int argc,const char *argv[])
//{
// char *pstr[10]={NULL};
// char a[10][50]={};
// int cnt=0;
// for (int i=0; i<10; i++) {
// pstr[i]=a[i];
// }
//
// for (int i=0; i<10; i++) {
// scanf("%s", pstr[i]);
// cnt++;
// if (getchar()=='\n') {
// break;
// }
// }
//
// for (int i=cnt-1; i>=0; i--) {
// printf("%s\n",pstr[i]);
// }
// printf("\n");
// return 0;
//}
#include<stdlib.h>
//
//int main(int argc, const char *argv[])
//{
// char *pstr[10]={NULL};
// int cnt=0;
// for (int i=0; i<10; i++) {
// pstr[i]= (char *)malloc(100*sizeof(char));
// scanf("%s",pstr[i]);
// cnt++;
// if (getchar()=='\n') {
// break;
// }
// }
//
// for (int i=cnt-1; i>=0; i--) {
// printf("%s\n", pstr[i]);
// }
// printf("\n");
//
// return 0;
//}//实现一个函数,传递两个字符数组,利用指针将第二个数组中的字符,拼接到第一个字符数组尾部,并在main函数里输出。
//比如:
//输入:
//hello
//world
//输出:helloworld
//int main(int argc, const char *argv[])
//{
// char str1[50]={};
// char str2[20]={};
// scanf("%s%s",str1,str2);
//
// int len1 = (int)strlen(str1);
// int len2 = (int)strlen(str2);
// for (int i=0;i<len2;i++) {
// str1[i+len1]= str2[i];
// }
// str1[len1+len2]='\0';
// printf("%s\n", str1);
// return 0;
//}
//atoi
//int atoi(const char *);
//int main(int argc,const char *argv[])
//{
// char str[100]={};
// scanf("%s",str);
// printf("%d\n",atoi(str));
// return 0;
//}
intmain(intargc,constchar*argv[])
{
inta[11]={};
inttemp;
for(inti=0; i<10;i++) {
scanf("%d",&a[i]);
}
scanf("%d",&temp);
for(inti=9; i>=0; i--) {
if(a[i]>temp) {
a[i+1]=a[i];
}
else
{
a[i+1]=temp;
break;
}
}
for(inti=0; i<11; i++) {
printf("%d ", a[i]);
}
printf("\n");
return0;
}