1. 学习指针必须得了解清楚内存,而内存到底是什么东西呢?内存就是电脑上的存储设备(除了内存之外,还有硬盘,寄存器等等),那内存到底是来干啥的呢?程序运行的时候会载入到内存当中,也会占用一些内存空间,那既然程序会使用内存,那么这个内存到底该怎么去管理它呢?
2. 当一个变量占了多个字节(内存单元)时,对变量取地址的时候取的是最低的地址,取地址取的永远都一个是内存单元的地址,但有些东西它本身也是一个地址,如数组名,字符串常量
3. 指针变量的类型的大小就决定了指针进行解引用操作的时候,一次性访问多少个字节,也就是说在解引用的时候决定了你的“势力范围是多少”,指针类型也决定了指针的步长(也就是说指针+1到底跳过几个字节,如果是字符指针+1,跳过的是一个字节;如果是整型指针+1,跳过四个字节)
4. 指针其实是可以运算的,但我现在还是要把指针的运算给他它总结一下,指针到底可以进行哪些运算呢?
(尤其要注意:地址,指针,内存编号,这三个概念都是完全等价的)
1. 指针+-整数。
2.指针-指针。
3.指针的关系运算(也就是指针比较大小)
5. 指针-指针这个的前提条件是两个指针要指向同一块空间(比如说同一个数组空间),并且这两个指针的类型肯定要一样,不是随便两个指针都能够进行相减操作,指针与指针相减得到的绝对值是两个指针之间的元素个数,至于正负,高减低肯定是正,这个想想就好了。
6. 在进行指针的关系运算(也就是指针比较大小) 时,允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但不允许与指向数组最前一个元素前面的那个内存位置的指针比较。
7. 在创建结构体类型时,不能类似于将结构体成员初始化,如int age = 0;不行的,只能int age;因为后面结构体变量初始化的时候就会一一初始化结构体成员。
8. 注意:结构体类型一定是带前缀struct的。
9. 初始化结构体变量与初始化数组一样,都是要带一个{ }的。
10. 结构体指针里面存放的是结构体变量的地址(对结构体变量取地址然后放到结构体指针里面),*(结构体指针)就可以找到结构体变量。
11. 访问结构体成员可以:结构体指针->结构体成员名,结构体变量.结构体成员名。
12. 使用 gets() 时,系统会将最后“敲”的换行符从缓冲区中取出来,然后丢弃,所以缓冲区中不会遗留换行符。这就意味着,如果前面使用过 gets(),而后面又要从键盘给字符变量赋值的话就不需要吸收回车清空缓冲区了,因为缓冲区的回车已经被 gets() 取出来扔掉了。
13. 寄存器与内存无关,是独立的存储空间,它是集成在CPU上面。这个内存是没有关系的,但在汇编代码里面可以使用寄存器。
14. 分解质因数数学步骤(质数与合数是在正整数范围内讨论,负数没有质数与合数这一说法)
1. 先让num(得是一个合数)除以最小质数2.
2(1). 如果能够整除,就把商再继续除2(并且这时候说明那个2已经被分解出来)
2(2). 如果不能够整除,就原数除以下一个大的质数,(并且这时候说明那个2不能被分解出来)
3. 一般来说,我们都是一开始去除以最小的质数2的,然后一旦除不通,就除以接下来大一点的质数,质数从小到大排列为:2,3,5,7,11...........
4,除到商也是质数的时候结束,这时候就已经分解质因数分解完了。
15. sqrt()返回的是double类型
16. ->高于++高于--高于* (优先级比较)
17. *(解引用操作符)后面但凡跟着一个地址都是可以的,比如说字符串常量也是一个地址:
18. 操作符的优先级一定要看清楚,同时,前置++与后置++也是一个大坑,时刻记着这个例子:*p++
一个简单的分解质因数器
代码:
#include <stdio.h>
#include <math.h>
int is_Div(int num)
{
int i = 0;
for (i = 2; i <= sqrt(num); i++)
{
if (num % i == 0)
{
return 0;//合数
}
}
return 1;//质数
}
int main()
{
printf("*****分解质因数*****\n");
while (1)
{
int num = 0;
printf("请输入一个数字(按0退出):");
scanf("%d", &num);
if (num == 0)
{
printf("退出成功\n");
break;
}
else if (num < 0)
{
printf("输入错误,重新输入\n");
}
else
{
//判断质数
if (is_Div(num))
{
printf("该数为质数,无法分解质因数,请重新输入.\n");
}
else
{
printf("分解质因数结果为:%d=",num);
int j = 2;
while (1)
{
if (num % j == 0)
{
num /= j;
printf("%d*",j);
if (is_Div(num))
{
printf("%d\n",num);
break;
}
}
else
{
j++;
}
}
}
}
}
return 0;
}
实现效果:
一个简单的计算开方数的程序
代码:
#include <stdio.h>
#include <math.h>
int main()
{
printf("*****计算一个被开方数的开方*****\n");
int num = 0;
while (1)
{
printf("请输入数字(按0退出):");
scanf("%d", &num);
if (num == 0)
{
printf("退出成功\n");
break;
}
else if (num < 0)
{
printf("该数为负数,输入有误\n");
}
else
{
if (sqrt(num) == (int)sqrt(num))
{
printf("结果为:%d\n",(int)sqrt(num));
}
else
{
printf("该数不为被开方数\n");
}
}
}
return 0;
}
实现结果: