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; //效果同上
c语言之指针
最新推荐文章于 2022-11-20 13:53:28 发布