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]);
  //这里存储的是指针数组里面的下表为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;//当全局变量没有被初始化是,默认是0
int 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-1
  printf("%d\n", ping);
  return 0;
}

数组排序,把一个数组中的偶数放在数组后面,奇数放在前面

思路:

(用循环)

1、从左向右判断指针指向的是否是偶数,如果是,就停下,如果是否,则指向右一个

2、从右向左判断是否是奇数,如果是,就停下,否就指向左一个

3、将两个数对换

4、循环

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;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值