[C 指针]()
每一个变量都有一个内存位置,
每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址.
`指针是一个变量,其值为另一个变量的地址,内存位置的直接地址.`
就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。
指针变量声明的一般形式为:`数据类型 * 变量名称;`
定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。
这些是通过使用一元运算符 * 来返回位于操作数所指定地址的变量的值.
函数指针重要的功能就是实现回调函数、
所谓回调函数就是函数先在某处注册、而在稍后某个需要的地方被调用。
函数指针一般作为函数的参数来使用、可以根据需要传递自定义的函数来实现指定的功能。
` *` : 没有任何特殊含义, 仅仅是为了标识 这是一个指针变量
1.指针只能用于保存地址
2.同一个变量可以有有多个指针 指向他
3.指针的指向可以修改
4.不要访问野指针
5.指针类型 是什么类型,就只能指向什么类型的数据
6. 指针为什么要分类型? 因为当我们使用指针 去取值的时候, 系统就会自动根据指针的类型来确定 应该取多少个字节中的值
int num; // 普通变量 num = 10; int * p; // 指针变量 , 在64位的编译器下 占用8个字节 p = # // 将num的地址 存储到p这个地址中 "(重点 : p = &num --- *p == num)"
#include <stdio.h> // 基本数据类型作为函数的参数是值传递, 在函数中修改形参的值 不会影响到 外面实参的值 void base(int num) { num = 55; } // 数组作为函数的参数是地址传递,如果是地址传递 在函数中修改 形参的值 会改变影响到外面实参的值 void array(int num[] ) { num[1]=120; } // 指针就是专门用于保存地址的 void point(int *p) //用什么接收地址? 指针 = 0ff123 { *p = 119; } int main() { int num1 =100; base(num1); printf("%d ",num1 ); //100 int num2[]={1,2,3}; array(num2); printf("%d ",num2[1] ); //120 int num4 = 99; int * num3 = &num4; point(num3); printf("%d ",num4 ); //119 }
#include <stdio.h> // int *v1 = &a int *v2 = &b // *v1 = a *v2 = b // v1 v2 占用8个字节 void swap(int *v1,int *v2) { int temp = *v1; *v1 = *v2; *v2 = temp; } int main() { // 1.定义一个函数交换两个变量的值 int a = 10; int b = 5; printf("交换前: a = %i, b = %i ",a,b); swap(&a, &b); printf("交换后: a = %i, b = %i ",a,b); return 0; }
#include <stdio.h> int demo(int v1,int v2,int v3,int *p1,int *p2); int main() { // 1.要求定义一个函数,传递三个值,返回这三个值和,差,平均值 int a = 10; int b = 20; int c = 30; // int res = demo(a, b, c); // printf("res = %i ",res); // 点翻译三个变量用于保存计算结果 int res1 = 0; // 和 int res2 = 0; // 差 // int res3 = 0; // 平均值 // 我们想要的就是调用完函数之后,和差平均值对应的变量 都被 "修改"为对应的值 int res3 = demo(a, b, c, &res1,&res2); printf("res1 = %i,res1 = %i,res1 = %i ",res1,res2,res3); return 0; } int demo(int v1,int v2,int v3,int *p1,int *p2) { int sum = v1 + v2 + v3; *p1 = sum; int m = v1 - v2 - v3; *p2 = m; int average = sum / 3; // 因为返回的是一个逗号表达式, 而逗号表达式的值 是最后一个表达式的值,所以返回的是average // return sum,m,average; /* // return 作用 1.返回值给调用者 2.结束函数 // 注意点 : return后面不可以写任何语句, 因为执行不到 return sum; printf("---"); return m; return average; */ return average; }
#include <stdio.h> int name[]={110,119,120}; void arr(int p[],int num){ // 如果参数为数组、则传入的数组参数是数组的内存地址、并没有将值复制一份给形参、而是直接将实参的地址传递进去 p[1]=num; printf("%p ",p ); // 获取内存地址 0x10cf86018 printf("%p ", &name); // 获取内存地址 0x1055ab018 } int main(){ printf("%p ", &name[0]); // 获取内存地址 0x1055ab018 printf("%p ", &name[1]); // 获取内存地址 0x1055ab01c printf("%p ", &name[2]); // 获取内存地址 0x1055ab020 arr(name,1000); printf("%d ", name[1]); // 1000 }
---------------------
[参考文章列表]() 特此表示感谢作者的分享、本文仅仅学习使用、欢迎指正!
[第08天C语言(09):指针-基本概念](https://www.jianshu.com/u/6ad63655bbcf)