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;
}
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;
}
- c语言指针例题
- C语言的指针例题
- c语言例题指针三
- C语言指针的例题
- c语言指针例题解答
- C语言例题1:
- C语言例题2:
- C语言例题3:
- C语言例题4:
- C语言例题5:
- C语言例题6:
- C语言例题7:
- C语言例题8:
- C语言例题9:
- C语言例题10:
- C语言例题11:
- C语言例题12:
- C语言例题13:
- windows 下架设svn服务器
- 组件关联关系
- 【数据结构】并查集之一
- 实现一个命令行linux终端应用程序,把输入的指定文件,映射到内存中,并打印出文件内容
- 采用xml格式的传输,两种实现方式
- c语言指针例题
- inverse属性
- 【OpenCV】基元检测 Primitive Detection
- 配置hbase出错
- 类继承关系映射
- Q25、(字符串)
- ruby on rails & nginx bug修复心得
- 阿里巴巴Dubbo实现的源码分析
- Java学习第二回:JAVA中包的概念了解:似懂非懂