C 指针
2019-01-09 本文已影响0人
心悦飞飞
每一个变量都有一个内存位置,
每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址.
`指针是一个变量,其值为另一个变量的地址,内存位置的直接地址.`
就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。
指针变量声明的一般形式为:`数据类型 * 变量名称;`
定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。
这些是通过使用一元运算符 * 来返回位于操作数所指定地址的变量的值.
函数指针重要的功能就是实现回调函数、
所谓回调函数就是函数先在某处注册、而在稍后某个需要的地方被调用。
函数指针一般作为函数的参数来使用、可以根据需要传递自定义的函数来实现指定的功能。
` *` : 没有任何特殊含义, 仅仅是为了标识 这是一个指针变量
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\n",num1 ); //100
int num2[]={1,2,3};
array(num2);
printf("%d\n",num2[1] ); //120
int num4 = 99;
int * num3 = &num4;
point(num3);
printf("%d\n",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\n",a,b);
swap(&a, &b);
printf("交换后: a = %i, b = %i\n",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\n",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\n",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\n",p ); // 获取内存地址 0x10cf86018
printf("%p\n", &name); // 获取内存地址 0x1055ab018
}
int main(){
printf("%p\n", &name[0]); // 获取内存地址 0x1055ab018
printf("%p\n", &name[1]); // 获取内存地址 0x1055ab01c
printf("%p\n", &name[2]); // 获取内存地址 0x1055ab020
arr(name,1000);
printf("%d\n", name[1]); // 1000
}
参考文章列表 特此表示感谢作者的分享、本文仅仅学习使用、欢迎指正!
第08天C语言(09):指针-基本概念