c语言之指针

int (* arr )[3]; //arr是一个指向包含3个int元素的数组的指针变量
struct Student *p_struct; //结构体类型的指针
int(*p_func)(int,int); //指向返回类型为int,有2个int形参的函数的指针 
int** p_pointer; //指向 一个整形变量指针的指针
//取地址
int num = 97;
int* p_num = #
//
int arr[3] = {1,2,3};
int (*p_arr)[3] = &arr;  
//
int add(int a , int b)
{
    return a + b;
}
int (*fp_add)(int ,int )  = add;

*p_age  = 20;  //通过指针修改指向的内存数据

//指针之间的赋值
int* p1  = & num;
int* p3 = p1;

//空指针
//指向空,或者说不指向任何东西。在C语言中,我们让指针变量赋值为NULL表示一个空指针,而C语言中,NULL实质是 ((void*)0) ,  在C++中,NULL实质是0。
//换种说法:任何程序数据都不会存储在地址为0的内存块中,它是被操作系统预留的内存块。

//错误
int*p;
*p = 10;      //Oops! 不能对一个未知的地址解地址

//void*类型指针  不知道类型的指针
//p->member 等价于 (*p).member

//改变数值
void change(int* pa)
{
    (*pa)++;   //因为传递的是age的地址,因此pa指向内存数据age。当在函数中对指针pa解地址时,
               //会直接去内存中找到age这个数据,然后把它增1。
}
int main(void)
{
    int age = 19;
    change(&age);
    printf("age = %d\n",age);   // age = 20
    return 0;
}
//数值交换
//正确的写法:通过指针
void swap_ok(int*pa,int*pb)
{
    int t;
    t=*pa;
    *pa=*pb;
    *pb=t;
}
//指针函数
void echo(const char *msg)
{
    printf("%s",msg);
}
int main(void)
{
    void(*p)(const char*) = echo;   //函数指针变量指向echo这个函数
    p("Hello ");      //通过函数的指针p调用函数,等价于printf("Hello ")
    return 0;
}
//const和指针
int a = 1;
   
    int const *p1 = &a;        //const后面是*p1,实质是数据a,则修饰*p1,通过p1不能修改a的值
    const int*p2 =  &a;        //const后面是int类型,则跳过int ,修饰*p2, 效果同上
    int* const p3 = NULL;      //const后面是数据p3。也就是指针p3本身是const .
    const int* const p4 = &a;  // 通过p4不能改变a 的值,同时p4本身也是 const
    int const* const p5 = &a;  //效果同上
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值