指针
指针是什么?
在计算机科学中,指针是编程语言的一个对象,它的值直接指向存在电脑存储器中另一个地方的值,因为地址能找到所需的变量单元,可以说地址指向变量单元,所以叫做‘指针’,形象些来说,就好像你想要拜访你的朋友张三,不管是你给他东西(赋值),还是你从他那里取东西(取值);又或者要干些其他的事,你都得先得找到他才行,而指针就好像一张标记着张三位置的地图,有了它你就可以立刻准确的找到张三。
指针是个变量,存放内存单元的地址,即使放进去的不是个地址,也只能当地址使用,当然这样的地图是找不到任何东西的…
还有,不管是int型的张三还是char型的李四,甚至是一屋子人的数组王五家,相同环境里指向他们的地图都是一样大的,所有指针在32位系统都是4个字节的大小,64位里都占8个字节
指针与指针类型
指针有类型吗?当然,指针的定义方式是type+*
int *pi = NULL;
char*pc = NULL;
short*ps = NULL;
float*pf = NULL;
double*pb = NULL
char类型的指针是为了存放char类型变量的地址;int类型的指针变量是为了存放int类型变量的地址;所以我们可以这样拆分开来理解:
type+*指定的指针类型中*用来说明这是一个指针,而*前面的type则是指明了指针指向的地址中存放的是什么类型的数据;这也往往决定了指针的权限有多大;字符指针类型只能改变一个字节中储存的数据,而整形指针类型则可以改变指针指向位置之后4个字节的数据,这正好符合了他们对应的数据类型的大小,若是将int类型数据用char类型的指针来操作,则往往会达不到想要的结果。
指针运算
指针与整数运算时即将储存的地址迁移对应的字节数,假如我们再需要打印一个数组,便可以直接通过指针来实现目的
char arr[] = "abcd";
int sz = sizeof(arr)/sizeof(arr[0]);
int i;
char* tpr = arr;
for(i = 0;i < sz;tpr++)
{
printf("%c",*tpr);
}
在连续的一段地址中,指针与指针之间也可以进行运算,比如我们想要得到一段数组的长度,只需要将最后一位元素的地址减去首元素地址就可以得到;但如果是不连续的地址段中的指针进行运算便没有意义了;就好像2015年5月5日加上2019年2月14日得到的结果一样。
还有一点我们需要注意:
在C语言的标准规定中,允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但不允许与指向第一个元素之前的那个内存位置的指针进行比较。
二级指针
指针变量也是变量,当然也就有地址,那麽我们可不可以将指针变量的地址存进一个指针里面呢?当然可以,这就是二级指针,其形式是type+**+变量名;其原理与形式与指针只有小许差别,需要注意的一点是:
int a = 5;
int *pa = &a;
int **ppa = &pa;
这里在进行解引用时*ppa得到的只是pa里存储的a的地址;**ppa才可以直接访问到a;
指针数组
既然指针存在指针类型,那么向int,char一样,多个指针类型的变量也可以放进同一个数组里,这就是指针数组
char* arr[10];
这里的arr数组便含有十个元素,每个元素都是一个字符指针;