Linux基本命令,vi编译器的使用,简单的编程步骤,程序语言,gcc编译器编译过程,进制转换相关知识可以查看文档http://t.csdnimg.cn/CmqhC
数值表示,词法符号,变量,常量相关知识可以查看文档http://t.csdnimg.cn/jJIe2
运算符和输表达式,输入输出相关知识可以查看文档http://t.csdnimg.cn/FJe89
控制语句,if-else,switch-case,for,while,do-while,循环控制语句相关知识可以产看文档http://t.csdnimg.cn/zskY3
一维数组,字符数组相关知识可以查看文档http://t.csdnimg.cn/1weqY
排序(冒泡排序和选择排序),二维数组相关知识可以查看文档http://t.csdnimg.cn/hvo5C
目录
指针
概念
地址:内存中每个字节单位都有一个编号(一般用十六进制表示)
指针:指针就是地址
指针变量:用于存放地址的变量
格式
存储类型 数据类型 * 指针变量名;
数据类型: 代表指针所指空间存放的数据的数据类型
例如:int a=10;
int *p=&a;
访问指针所指空间的内容时用取内容运算符*
指针操作符
&:取地址,取变量的地址
*:取内容,取地址里面的内容
*&a = a; //*和&是互逆运算(抵消)
&*a; //错误 (原因:运算符优先级)
初始化和赋值
指针变量在使用前不仅要定义还要初始化,未初始化的指针变量不能随便使用,不然会产生野指针。
1.普通变量的地址赋值给指针变量
int a=5;
int *p=&a;
2.数组首地址赋值给指针变量
char s[]="hello";
char *p=s;
3.将指针变量里卖弄保存的地址赋值给另一个指针变量
int a=10;
int *p=&a;
*q=p;
指针运算
1.算术运算:+ -
(1)对指针加减操作其实是让指针向前或向后移动
p+n: 访问高地址方向的第n个数据的地址,指针指向不改变。
p-n: 访问低地址方向的第n个数据的地址,指针指向不改变。
(2)指针偏移字节
偏移字节数=偏移量*数据类型大小
两个地址之间的差= 两个地址之间相隔元素的个数
p-q = 直接按相隔元素个数
2.关系运算:< > == !=
指针之间关系运算比较的是它指向地址的高低
指向高地址的指针大于指向低地址的指针
注意:指向不同类型的数组指针关系运算没有意义,指向不同区域的指针关系运算也没有意义,需要同一个数组间进行比较
例题:利用指针判断输入的字符串是否为回文数
#include <stdio.h>
#include <string.h>
int main()
{
char s[100];
gets(s);
int len = strlen(s);
char *p = s;
int flag = 0;
for (int i = 0; i < len; i++)
{
if (*(p + i) != *(p + len - i - 1))
{
printf("不是回文数\n");
flag++;
break;
}
}
if (flag == 0)
{
printf("是回文数\n");
}
return 0;
}
指针的大小
计算指针变量大小:siezof(指针变量名);
总结:
1. 32位操作系统,指针大小4字节,64位操作系统,指针大小8字节
2.内存地址是固定的,但是变量的地址不固定的(栈区变量随机分配)
3.指针类型根据指针指向空间的数据类型
指针修饰
1.const常量化
注意:const定义变量时必须在定义的时候就给它赋初值。
(1)修饰普通变量
修饰局部变量:
const int a=10; //int const a=10;
此时a只读,不可以修改。但是可以通过指针修改。
int *p=&a;
*p=20; //可以用指针间接修改,会报警告。
修饰全局变量:
放在常量区,不能通过指针修改,会报段错误