PHP小丑 发表于 2021-12-4 22:45:24

C语言指针进阶及相关题目

字符串常量

#include<stdio.h>int main(){char arr1[] = "hellow";char arr2[] = "hellow";char* arr3 = "hellow";//由于指向的是相同常量,所以指向同一个地方更省空间char* arr4 = "hellow";//这里指针可以指向一个字符串,但是字符串是一个常量,无法用指针进行更改//*p="w";是错误的//相当于const char* arr3 = "hellow";if (arr1 == arr2)    printf("相同\n");else    printf("不同\n");if (arr3 == arr4)    printf("相同\n");else    printf("不同\n");return 0;}
指针数组(和二维数组相同)

#include<stdio.h>int main(){int a[] = { 1,2,3,4,5 };int b[] = { 2,2,3,4,5 };int c[] = { 4,2,3,4,5 };int* p[] = { &a,&b,&c };//printf("%d\n", *p);//这里存储的是指针数组里面的下表为0的内容//是1个地址,并且是a的首元素的地址int i = 0, j = 0;for (i = 0;i < 3;i++){    j = 0;    for (j = 0;j < 5;j++)    {      //printf("%d ", *(p + j)); //这里的p表示p里面的一个内容,由于存放的是地址,+j是里面的地址+它的步长      printf("%d ", p);//这里也会被解释成上面的情况    }    printf("\n");}return 0;}int main(){//float i = 9.0;//printf("%d\n", i);//这里是用浮点数把9.0放进去//读取的时候还是浮点型,但是打印的时候是整形打印////再打印的时候把一个浮点数用整形进行打印float i = 9.0;//这里是用浮点数把9.0放进去int* p = (int*)&i;//这里是先把浮点数先转换成int类型,然后用p指向i,直接打印printf("%d\n", *p);return 0;}
数组指针
数组指针主要用于二级指针的访问,即指针数组的访问
int main(){int a[] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7,} };int(*p) = &a;//这里指向的是数组里面的一个数组名,即指向的是整个第一个数组int i = 0, j = 0;for (i = 0;i < 3;i++){    for (j = 0;j < 5;j++)    {      printf("%d ", *(*(p + i) + j));//*(p+i)是三个一级数组,+j是指向每一级数组里面的二级数组    }    printf("\n");}return 0;}
容易记混的难点
---------------------------------text(int*arr)//这里接受的以也是整个二级数组的地址{printf("%d ", *(arr + 3));//4}-----------------------------------------text(int* arr[])//这里是一个数组,一个存放指针的指针数组,和实参不一样,错误{printf("%d ", *(arr + 3));}----------------------------------------text(int arr)//这是一个整形,但是传过来的是一个地址不一样{}-----------------------------------------------------text(int arr[])//这里接受的是整个数组,和原来的一样{printf("%d ", *(arr + 3));printf("%d ", arr);}---------------------------------------------------text(int(*arr))//这里是*arr是来代替出递过来的二级数组,//但是arr确实一级数组,即指向的是整个数组{printf("%d ", *(*arr + 3));}--------------------------------------------------------text(int** arr)//不能这样写,传过来的是一个指向数组的指针,不是一个二级指针{printf("%d ", *(arr + 3));}--------------------------------------------------------int main(){int arr[] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };text(arr);//这里是arr首元素的地址,是整个二级数组的地址,相当于*arrreturn 0;}
​​相关题目
第一题:求输出结果

#include<string.h>int i;//当全局变量没有被初始化是,默认是0int main(){i--;//if (i > sizeof(i))    //类型的sizeof(i)的结果是unsigned int。因此,如果我们想将i与sizeof(i)进行比较,我们需要将i的类型转换为unsigned int    //因此,i转换为无符号的结果是,使i变成一个非常大的数字(其符号位转换为一个数字)    printf(">\n");else    printf("<\n");return 0;}第二题:求输出结果

int main(){int a = 0;int n = 0;int sum = 0, ret = 0;;int i = 0;scanf("%d %d", &a,&n);for (i = 0;i < n;i++){    ret = ret * 10 + a;    sum = sum + ret;}printf("sum = %d\n", sum);return 0;}第三题:使用指针访问数组里面的元素

int main(){int arr[] = { 1,2,3,4,5,6,7,8,9 };int* p = arr;int i = 0;for (i = 0;i < 9;i++){    printf("%d\n", *(p + i));}return 0;}第四题:求1-10000之间的水仙花数

#include<math.h>int main(){int i = 0, n = 0,tmp = 0;int sum = 0;for (i = 0;i < 10000;i++){    //判断一共有几位数,n    tmp = i;    n = 1;    while (tmp/10)    {      n++;      tmp = tmp / 10;    }    //判断是否是水仙花数    tmp = i;    sum = 0;    while (tmp)    {      sum += pow(tmp % 10, n);      tmp = tmp / 10;    }    if (sum == i)      printf("%d ", sum);}return 0;}菱形的打印
效果:
代码和理解
思路:
1、让每一行的打印数量都和i相关的联系
2、星号后面不用打印空格
int main(){int line = 0;scanf("%d", &line);//输入行数:是上半部分的行数int i = 0;for (i = 0;i < line;i++)//打印7行,这里一共是7行{    //输出上半部分    int j = 0;    //打印一行    //' '    for (j = 0;j < line - i - 1;j++)    {      printf(" ");    }    //打印'*'    for (j = 0;j < 2 * i + 1;j++)    {      printf("*");    }    printf("\n");}for(i=0;i<line-1;i++)//这里一共是6行{    //输出下半部分    //输出' '   int j = 0;    for (j = 0;j <=i ;j++)    {      printf(" ");    }    //输出'*'    for (j = 0;j < 2 * (line - i)-3;j++)    {      printf("*");    }    printf("\n");}return 0;}

1块钱1一瓶饮料,两个空瓶换一瓶饮料,20块钱能喝多少瓶

int main(){int ping = 0;//瓶子计数器scanf("%d", &ping);int kong = ping;//空瓶计数器int tmp = 0;do {    tmp = kong % 2;//先计算有多少个先把剩余的瓶子存起来    kong = kong / 2;//再在计算剩余的瓶子能换多少瓶子    ping = kong + ping;//加进总数里面    kong = kong + tmp;//再把存起来的瓶子和新的剩余的瓶子加起来} while (kong != 1 && kong != 0);//规律是2n-1printf("%d\n", ping);return 0;}数组排序,把一个数组中的偶数放在数组后面,奇数放在前面
思路:
(用循环)
1、从左向右判断指针指向的是否是偶数,如果是,就停下,如果是否,则指向右一个
2、从右向左判断是否是奇数,如果是,就停下,否就指向左一个
将两个数对换
循环
void print(int* arr, int sz){int i = 0;for (i = 0;i < sz; i++){    printf("%d ", arr);}}void move(int* arr, int sz){int left = 0;int right = sz - 1;while (left < right){    while ((left<right)&&(arr % 2==1))//偶数    {      left++;    }    while ((left < right) &&(arr % 2==0))//奇数    {      right--;    }    int tmp = 0;    tmp = arr;    arr = arr;    arr = tmp;}}#include<string.h>int main(){int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int sz = sizeof(arr) / sizeof(arr);move(arr,sz);print(arr, sz);return 0;}




https://blog.51cto.com/u_15409770/4747606
页: [1]
查看完整版本: C语言指针进阶及相关题目