【基础层】##编程##笔记##C## Chapter_4:指针

###################################################################################################
Chapter_4
指针

    指针变量,指针常量(指针常量就是变量的地址)
    
    指针本身是个地址量,类似100a
    使用100a访问变量内存是直接访问
    使用指针是间接访问
    
    指针也是一种数据类型,它存储的是地址
    指针可以指向任何的数据类型&函数
    
    命名:
    <存储类型><数据类型> * pa;
        char *pa;
        static int *px;
    初始化:
        int a[5];
        int*pa=&a[4];
        
        char cc;
        char *pc=&cc;

        注意:标准C不允许使用 int *point=1000; //标准C语言 不允许赋整型值,某些嵌入式开发的可以这么干
        
    取地址符&: >>数据类型增加一级
        不允许取数组名,常量,寄存器变量
    取内容符*:    >>数据类型降低一级
    
注意:
    二级指针就是一级指针变量的地址。
    int * pc;
    int ** pc=&p;
    
指针本身大小:
    near型指针:两个字节
    far型指针:四个字节

void指针:
    <存储类型> void * 指针变量名;  //无类型指针
    
指针的运算

1.指针的算术运算
    p1++,p1+2,++p1,p1--,p1-2,--p1,p1-p2
    注意不同数据类型指针地址量变化 sizeof(*p) //注意这不是sizeof(p) //因为near类型的都是两个字节
    char*p1;
    p1++; 多一个地址
    int*p1;short *p1;等等
    p1++;多两个地址
    
    运算优先级
    *和++是优于=的,但是规则是从右到左 y=*(px++)
    
    标准函数库里面字符串复制函数源码
    char * strcpy(char *dest, char *src)
    {
        char*temp=dest;
        while((*temp++=*src++)!='\0');
        return temp;
        
    }
2.指针的关系运算
    p1<p2 返回值为1 反之为0 ?什么是指向后方的指针大于指向前方的指针
    p==0 p!=0 判断是不是空指针
3.指针的赋值运算
    1.char c, *pc; //变量地址赋予指针
       pc=&c;
    2.int *p,*q; //一个指针值赋予另一个相同数据类型的指针
       …q指向一个目标
       p=q;
    3.char name[20]; //数组地址赋予相同数据类型指针
       char *p;
       p=name; //p=&name[0]; //数组名是一个地址常量,不允许对数组名赋值
    4.动态内存分配技术
       #include<stdlib.h>
       #include<alloc.h>
    函数原型
       void *malloc(unsigned size)
       void free(void *ptr)
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<alloc.h>
    #include<string.h>
    
    void main()
    {
        char *str;
        //这两个都可以
        //if(!(str=(char*)malloc(10*sizeof(char))))
        if ((str=(char *)malloc(10*sizeof(char)))==NULL) //malloc函数返回空指针,所以需要(char *)强制类型转换一下
        {
        printf("not enough memory to allocte bufer\n");
        exit(1);
        }
    }
    

指针和数组:
    int a[10];
    int *pa;
    
    如果我们进行了赋值操作
    pa==a;//或者是 pa=&a[0];
    那么
        a[i],pa[i],*(pa+i),*(a+i) 都是一样的
    注意,数据类型上,数组名是地址常量,此处的指针是一个变量
        
指针和字符串:    
    字符串是字符指针常量
    C语言经常使用char 型指针来处理字符串,因此char型指针也称之为字符指针
    1. 字符串常量初始化字符指针
    char *pc;
    pc="c_program"
    2. 程序中使用字符串赋给一个指针    
    
    注意scanf使用的这个pa必须先赋值或者先定义
    
    char str[80];
    scanf("%s",pa); //将输入的字符放到指针pa指向的地址中
    printf("%s",pa);
    
    char *p;
    p="c_programming_language"; //系统先开辟一块内存存储这个字符串,然后将首地址赋予指针

指针数组:
        int *point[10];
        int data[2][3];
        //data 赋值
        for(i=0;i<10;i++)
        {
            point[i]=data[i];
        }
        
        data[i][j]        pdata[i][j]
        *(data[i]+j)    *(data[i]+j)    
        *(*(data+i)+j)    *(*(data+i)+j)
        意思都是一样的,但是注意赋值方式
        
使用指针常见的错误:
    1. 这个是scanf原理错误,将输入的字符串存到指针所指向的位置 
    char *p;
    scanf("%s",p);这个是错误的!
    2. 输入超过长度
    char str[10];
    scanf("%s",str);
    3. char *p="TurboC++";
    strcpy(p,"BorlandC++");
    也会出现类似的问题
 

猜你喜欢

转载自blog.csdn.net/husterjwx/article/details/88429462