C语言学习--指针

变量地址--起始地址

指针和地址等价

指针变量存储地址-----------int *i_pointer;   实现间接访问

int main(){

        int i =5;

        int *i_pointer=&i ; //定义了一个指针变量

        //指针变量的初始化,某个变量取地址来赋值,不能随机写个数

        printf(_Format:"i=%d\n",i);//直接访问

        printf(_Format:"*i_pointer=%d\n",*i_pointer);//间接访问

        return 0;

}

取地址运算符(引用)&。  取值操作符 *。 单目运算符 右至左

&*i_pointer=i_pointer.          *&a=a

int a ,b,c.     int *a,b,c =int* a,b,c.  int *a,*b,*c

---------------------------------------------------------

指针的传递使用场景 --传递和偏移

void change(int j){

        j=5;

}

int  main(){

        int i =10;

        printf(_Format:"before change i=%d\n",i);

        change(i);//c语言函数调用是值传递,实参赋值给形参,j=1

        printf(_Format:"after change i=%d\n",i);

        return 0;

       }

---------------------------------------------------

void change(int *j){

        *j=5;

}

int main(){

        int i =10;

        printf(_Format:"before change i=%d\n",i);

        change(&i);//c语言函数调用是值传递,实参赋值给形参,j=&i

        printf(_Format:"after change i=%d\n",i)

}

---------------------------------

指针的偏移使用场景---对指针进行加或减

#define N 5

int main(){

        int a[N]={1,2,3,4,5};//数组名内存储了数组的起始地址,a中存储的就是一个地址值

        int *p;

        p=a;

        int i;

        for(i=0;i<N;i++){

        printf(_Format:"%3d",*(p+1));//与a[i]等价

}

        p=&a[4];

        for (i=0;i<N;i++){

        printf("%3d",*(p-i));

}                

}

--------------------------------

指针与一维数组

数组名作为实参传递给子函数时,是弱化为指针的

void change(char *d) {

        *d='H';

        d[1]='E'; //*(d+1)='E'

        *(d+2)='L';

}

int main(){

        char c[10]="hello";

        change(c);

        puts(c);

        return0;

-----------------------------------------------

指针与malloc 动态内存申请

堆和栈的差异 堆空间在整个进程中一直有效,不因为函数调用结束而释放

int main(){

        int size; void类型指针不能偏移,因此不会定义无类型指针

        char *p; //

        scanf("%d",&size); //输入申请空间大小

        //malloc返回的void * 代表无类型指针

        p=(char*)malloc(size);

        strcpy(p,"malloc success");

        puts(p);

        free(p);

        printf("free success\n");

        return0;

}

 -----------

char *print_stack(){

        char c[100]="i'm print_stack func";

        puts(c);

        return c;

} //栈空前由操作系统管理

char *print_malloc(){

        char *p=(char *)malloc(100);

        strcpy(p,"i'm print malloc func")

        puts(p);

}//堆空间在整个进程中一直有效,不因为函数调用结束而消亡

int main(){

         char *p;

        p=print_stack();

        puts(p);

        p=print_malloc();

        puts(p);

        free(p);释放堆空间

        return 0;

}

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值