指针是C语言的精髓所在,简单的讲解是远远不够的,此块内容需要学者自行深入研读
指针和指针变量:
指针是一种数据类型,例如int *
变量是一种载体,存放数据
指针变量,就是存放地址的变量
类型转换
整型
1.字节数较小的类型,可以转换为字节数较大的类型
short s=3;
int a=s;
浮点型
2.精度低的类型,可以向精度高的类型转换
float a=1.0;
double s=a;
整型/浮点型
float sum=3.5;
int a=sum;
相当于强制类型转换
void *
无类型的指针,可以转换为任意其他类型的指针
int a;
void *s;
s=(int *)&a;
字符指针:
char *p=“hello world”;
p是指向字符串的指针变量,它存放的是字符串的首地址
%s:
格式控制符接收首地址,一直打印字符,直到遇到‘\0’换行跳格等结束
printf("%s\n",p);
char *q="nihao,furong";
q=q+5;
*q='c';
以上的操作时非法的,因为字符串是存在于常量区, 常量区是只读的,所以经常出现段错误
q="hello.world!";
此操作时合法的,因为,我们只是改变了指针变量q的指向,没有改变字符串的内容
补充:
进程对内存空间的划分
a.代码段(readonly)
存放二进制代码
b.数据段
全局数据区(static)
初始化的全局变量/静态变量
BSS区
未初始化的全局变量
在程序运行前,会将BSS区清零
堆
动态分配内存
由程序员自己分配,自己释放,但是效率比较低,容易产生内存碎片,但是使用方便
c.栈
存放临时变量/局部变量
由系统自动分配内存,效率较高,但是程序员不能控制
d.文字常量区(readonly)
存放常量/字符串,程序结束后由系统释放
变量的生存周期和作用域
局部变量
1.局部变量定义在函数内部
2.局部变量的作用范围{}
3.未初始化的局部变量的值是不可预期的
4.函数调用的时候分配空间,函数结束,空间被释放
全局变量
1.定义在函数外部
2.全局变量的作用域,存在于当前文件
3.未初始化的全局变量的值为0
4.存在于整个程序运行中
注意:在整个文件的任意位置,对它进行修改,都会对它的值产生影响
常量
动态分配空间
#include
char *p;
p=(char *)malloc(30);
为什么要为指针动态分配空间?
指针在定义出来时是没有指向的,我们为了避免出现野指针的现象,要么给指针找一个指向,再或者
为其动态分配一段地址空间,由程序员手动分配,最后使用完,手动释放
free(p)
const
作用:修饰变量,让其变为一个只读常量
const int a=5;
a=6;//error
int const b=6;
b=7; //error
const char *p
char const *p
等价的:都是指针的指向可以改变,但是指向的内容不可以变
char *const p:指向的内容可以变,但是指向不可以变
const char * const P 指向的内容和指向都不可以变
二维数组:
它是一种网状的数据结构,它的存储方式和一维数组相同
基本的定义方式:
类型 + 数组名+【行数】【列数】
1 2 3 4
4 5 6 8
7 8 9 9
int a[][]={1,2,3,4,5,6,7,8,9}
定义的时候可以省略行数,但是不能省略列数
地址问题
&a[0][0]
a-----二维数组的数组名,同样表示第0行第0列元素的首地址
&a[0]
*a
------------
*(a[0]+3)
a[1]
a[2]
每行的首地址
pointer.rar