翁恺C笔记|指针

来源:互联网 发布:如何提高淘宝排名 编辑:程序博客网 时间:2024/06/10 17:54

【指针应用场景】

1.函数需要返回多个值,其中一些值可通过指针返回。传入的指针参数其实是需要保存带回结果的变量;

例程:

#include <stdio.h>#include <stdlib.h>void swap(int* a,int* b);int main(){    int a=5,b=6;    swap(&a,&b);    printf("a=%d b=%d",a,b);    return 0;}void swap(int* pa,int* pb){    int t=*a;//t为pa指向地址所存储的值,即5    *pa=*pb;//将pa指向地址所存储的值更新为pb指向地址所存储的值,即pa地址中现在存的是6    *pb=t;//将pb指向地址所存储的值更新为t的值,即5}
2.需要传入较大的数据时用作参数;

3.传入数组后对数组做操作;

4.动态申请内存。


【指针常见错误】
1.定义指针时,没有让其指向任何地址,之后直接给该指针指向地址赋值,如:

int *a;//定义了一个指针变量,不知道指向哪里(可能指向一块写操作非法区域)。*a=5;//此时写,可能会访问非法内存,段错误,程序异常终止。int *a=0;//指向0地址,0地址是一个不能随便碰的地址。*a=5;//此时写入,程序一定会崩溃。

【0地址】

1.可以用0地址做一些特殊的事情:

(1)返回的指针时无效的;

(2)指针没有被真正初始化(先初始化为0,后面如果没有对该指针真正初始化,就对其进行操作,就一定会造成程序崩溃)。

2.C语言预先定义的NULL(全大写哦~),表示0地址。

3.申明指针的时候,用NULL对其初始化是一个编程的好习惯!

【指针运算】

指针可以做加减、比较运算,不能做乘除运算。

int main(){  char ac[]={0,1,2,3,4};  char* cp=ac;  printf("cp=%p\n",cp);//其中,%p表示输出指针的值。  printf("cp+1=%p\n",cp+1);    int ai[]={0,1,2,3,4};  int* ci=ai;  printf("ci=%p\n",ci);  printf("ci+1=%p\n",ci+1);    return 0;}
运行结果:


sizeof(char)=1,sizeof(int)=4

指针加一表示将指针移动到下一单元。char类型占据1byte,所以cp+1地址和cp地址相差1;int类型占据4byte,所以ci+1地址和ci地址相差4。

但是,如果有int ci1=&ai[3],不要以为ci1-ci会等于18,实际等于3。表示两个地址之间有三个int单元。


【*p++】

取出p地址处的数据,然后将p移动到下一位置。

接上面一个代码段:

while(*cp!=-1)    printf("%d\n",*cp++);

运行结果为:



【指针类型转换与void*】

1.无论指向什么类型,所有的指针大小都是一样的,都是地址;

2.为了避免用错指针,指向不同类型的指针不能相互赋值(不要忘记不同类型数据sizeof的结果不同哟~);

3.void*表示不知道指向什么的指针。计算时与char*相同,但不相通。常用在底层编程中。;

4.指针转换类型:int* p=&i;void* q=(void*)p;没有改变p所指变量的类型,只是q看待p所指的百年来那个为void类型。(excuse me????)


0 0
原创粉丝点击