首页 > 其他分享 >指针(初级)+练习

指针(初级)+练习

时间:2022-10-18 14:32:54浏览次数:54  
标签:arr int 练习 tempt 初级 printf include 指针

1.指针是用来存放地址的,地址是唯一标示一块地址空间的。指针的大小在32位平台上是4个字节,在64位平台上是8个字节

2.指针类型决定了指针进行解引用操作的时候,能够访问空间的大小(能够操作几个字节)。

int*   p;  *p能够访问4个字节

char*  p;  *p能够访问1个字节

double*   p;*p 能够访问8个字节

3.野指针问题

  • 指针未初始化(int*p;)
  • 指针越界
  • 指针指向了已经释放的空间

如果在指针初始化的时候,真的不知道要赋什么值,可以赋值为NULL,空指针。当一个指针变量不再使用的时候,可以将其赋为空指针,空间释放。

4.指针运算

  • 指针+-整数
  • 指针-指针  一般是同一个数组中的指针相减,如果出现 &arr[5]-&ch[9]的话,这样的结果是很难预测的。  (指元素个数,&arr[9]-&arr[0]=9)
  • 指针的关系运算

5.二级指针

如:int a=0;

        int* pa=&a;

        int* *ppa=&pa;

6.指针数组——本质上是一个数组 ,存放指针的数组  如:int* arr[3]={&a,&b,&c};

   数组指针——本质上是一个指针

 7.创建一个整型数组,完成对数组的操作:1.实现inite()函数的初始化为0

                                                                2.实现printf()打印数组的每个元素

                                                                3.实现reverse()函数元素的逆序输出

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include <stdlib.h>

void Initate(int arr[], int sz)

{

       int i = 0;

       for (i = 0; i < sz; i++)

       {

              arr[i] = 0;

       }

}

void reverse(int arr[], int sz)

{

       int left = 0;

       int i = 0;

       int tempt = 0;

       int right = sz - 1;

       while (left < right)

       {

              tempt = arr[left];

              arr[left] = arr[right];

              arr[right] = tempt;

              left++;

              right--;

       }

       for (i = 0;i < sz; i++)

       {

              printf("%d ", arr[i]);

       }

}

int main()

{

       int i = 0;

       int sz = 0;

       int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };

       Initate(arr1, sz);

       sz = sizeof(arr1) / sizeof(arr1[0]);

       for (i = 0; i < sz; i++)

       {

              printf("%d ", arr1[i]);

       }

       printf("\n");

       reverse(arr1, sz);

       return 0;

}

8.

#include <stdio.h>

int i;   //i是全局变量,在没有初始化的时候,默认为0

int main()

{

    i--;

    if(i>sizeof(i))  //sizeof()再计算变量/类型所占内存的大小的时候,结果是>=0,即为无符号数,所以在与其他数进行比较得时候,要把其他数转换成无符号数,所以-1转换成无符号数必定大于4

    {

        printf(">"\n);

    }

    else

   {

    printf("<\n");

   }

    return 0;

}

结果“>”


9.计算一个数,二进制补码中有多少个1?

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include <stdlib.h>

int main()

{

       int n = 0;

       int i = 0;

       int count = 0;

       printf("请输入一个数\n");

       scanf("%d", &n);

       for (i = 0; i <32 ; i++)

       {

              if (((n >> i) & 1) == 1)

              {

                      count++;

              }

       }

                                        while(n)

                                       {

                                         n=n&(n-1);

                                          count++;

                                        }这个步骤会更高效,前面那个程序要循环32次,此程序有几个1就循环几次。

       printf("%d\n", count);

       return 0;

}

10.求两个数中有几个位不同?

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include <stdlib.h>

int main()

{

       int n = 0;

       int m = 0;

       int i = 0;

       int tempt = 0;

       int count = 0;

       printf("请输入两个数\n");

       scanf("%d %d", &n,&m);

       tempt = m ^ n;    //m与n异或,异或的结果有多少个1就表示有多位不同。

       while (tempt)

       {

              tempt = tempt & (tempt - 1);

              count++;

       }

       printf("%d\n", count);

       return 0;

}

11.分别打印一个数的奇数位和偶数位。

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include <stdlib.h>

int main()

{

       int a = 0;

       int i = 0;

       int tempt = 0;

       printf("请输入一个数:>");

       scanf("%d", &a);

       //打印奇数项

       for (i = 30; i >= 0; i -= 2)

       {

              tempt = (a >> i) & 1;

              printf("%d ", tempt);

       }

       printf("\n");

       //打印偶数项

       for (i = 31; i > 0; i -= 2)

       {

              tempt = (a >> i) & 1;

              printf("%d ", tempt);

       }

       return 0;

}

12.实现一个字符串的逆序

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

int main()

{

       char arr[100] = { 0 };

       int sz = 0;

       int left = 0;

       int tempt = 0;

       int i = 0;

       printf("请输入一个字符串:\n");

       scanf("%s", &arr);

       sz = strlen(arr);

       int right = sz - 1;

       while (left < right)

       {

              tempt = arr[left];

              arr[left] = arr[right];

              arr[right] = tempt;

              left++;

              right--;

       }

              printf("%s", arr);

       return 0;

}

13.计算一个数各个位之和

非递归方法

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include <stdlib.h>

int main()

{

       int  a =  0 ;

       int sum = 0;

       int m = 0;

       int n = 0;

       printf("请输入一个数:");

       scanf("%d", &a);

       do

       {

              m = a % 10;

              n = a / 10;

              sum += m;

              a = n;

       } while (n);

       printf("%d\n", sum);

       return 0;

}

递归的方法

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

int Digui(int a)

{

       if (a > 9)

       {

              return Digui(a / 10) + a % 10;

       }

       else

       {

              return a;

       }

}

int main()

{

       int  a =  0 ;

       int sum = 0;

       printf("请输入一个数:");

       scanf("%d", &a);

       sum=Digui(a);

       printf("%d\n", sum);

       return 0;

}

14.计算n^k

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

double Digui(int a,int b)

{

       if (b<0)

       {

              return (1.0/Digui(a,-b));

       }

       else if(a==0)

       {

              return 1;

       }

       else

       {

              return a*Digui(a, b-1);

       }

}

int main()

{

       int  n =  0 ;

       int  k =  0;

       double sum = 0;

       printf("请输入一个数:");

       scanf("%d%d", &n,&k);

       sum=Digui(n,k);

       printf("%lf\n", sum);

       return 0;

}


标签:arr,int,练习,tempt,初级,printf,include,指针
From: https://blog.51cto.com/u_15760583/5766682

相关文章

  • LeetCode 167. Two Sum II - Input array is sorted(双指针)
    ​​题目​​题意:找出数组里两个数字之和为指定数字的两个下标。题解:双指针classSolution{public:vector<int>twoSum(vector<int>&numbers,inttarget){......
  • JDBC工具类-JDBC练习-登录案例
    *目的:简化书写*分析: 1.注册驱动也抽取 2.抽取一个方法获取连接对象 *需求:不想传递参数(麻烦),还得保证工具类的通用性。 *解决:配置文件 ......
  • JDBC练习-select语句和JDBC工具类
    JDBC练习-select语句练习:定义一个方法,查询emp表的数据将其封装为对象,然后装载集合,返回。1.定义Emp类封装Emp表数据的JavaBean2.实现方法public List<Emp>findA......
  • 一个简单的vuedraggle练习
    在vue项目中npmi vuedraggable引入页面中<template><divclass="row"><divclass="col-1"><h3>组件</h3><draggablecl......
  • 【MySQL练习】多表查询练习(二)
    查看代码:数据库和表数据创建CREATEDATABASE`wudang`;USE`wudang`;CREATETABLE`t_dept`(`id`INT(11)NOTNULLAUTO_INCREMENT,`deptName`VARCHAR(30)DEFAU......
  • 数据挖掘专项练习
    联机事务处理(On-LineTransactionProcessing,OLTP):面向的是业务和运维人员,以应用为核心,是应用驱动的联机分析处理(On-LineAnalyticalProcessing,OLAP):面向决策人员和高层......
  • 【MySQL练习】多表查询练习(一)
    表数据:https://www.cnblogs.com/zhishu/p/16452950.html1.显示所有员工的姓名,部门号和部门名称。所有员工,用leftjoin。leftouterjoin和leftjoin的效果是一样的。......
  • python学习记录9:代码雨效果(random库练习)源码
     importsysimportrandomimportpygamefrompygame.localsimport*#屏幕大小WIDTH=800HEIGHT=600#下落速度范围SPEED=[15,30]#字母大小范围SIZ......
  • 【图形学】计算机图形学-练习题6
    【图形学】计算机图形学-练习题6​​一、题目一​​​​1.1作业题目​​​​1.2作业解答​​​​二、题目二​​​​2.1作业题目​​​​2.2作业解答​​一、题目一1.1......
  • ResultSet练习
    练习:定义一个方法,查询emp表的数据将其封装未对象,然后装载集合,返回1,定义emp类2,定义方法 publicList<Emp>findAll(){}3,实现方法 select* from emp......