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