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;

}