评论

收藏

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

编程语言 编程语言 发布于:2021-12-04 22:45 | 阅读数:565 | 评论:0

字符串常量
#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]);  //这里存储的是指针数组里面的下表为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[i] + j)); //这里的p[i]表示p里面的一个内容,由于存放的是地址,+j是里面的地址+它的步长    printf("%d ", p[i][j]);//这里也会被解释成上面的情况  }  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[][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7,} };  int(*p)[5] = &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[3]);}---------------------------------------------------text(int(*arr)[5])//这里是*arr是来代替出递过来的二级数组,//但是arr确实一级数组,即指向的是整个数组{  printf("%d ", *(*arr + 3));}--------------------------------------------------------text(int** arr)//不能这样写,传过来的是一个指向数组的指针,不是一个二级指针{  printf("%d ", *(arr + 3));}--------------------------------------------------------int main(){  int arr[][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };  text(arr);//这里是arr首元素的地址,是整个二级数组的地址,相当于*arr  return 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;}
菱形的打印
效果: DSC0000.png
代码和理解
思路:
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-1  printf("%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[i]);  }}void move(int* arr, int sz){  int left = 0;  int right = sz - 1;  while (left < right)  {  while ((left<right)&&(arr[left] % 2==1))//偶数  {    left++;  }  while ((left < right) &&(arr[right] % 2==0))//奇数  {    right--;  }  int tmp = 0;  tmp = arr[left];  arr[left] = arr[right];  arr[right] = tmp;  }}#include<string.h>int main(){  int arr[] = { 1,2,3,4,5,6,7,8,9,10 };  int sz = sizeof(arr) / sizeof(arr[0]);  move(arr,sz);  print(arr, sz);  return 0;}




关注下面的标签,发现更多相似文章