C语言指针
指针 2016年7月18日 星期一 19:20
void change(int *v1 ,int *v2)
{
int temp = *v1;
// *v1 ==a *v2 ==b
*v1 = *v2;
*v2 = temp;
}
int main(int argc, const char * argv[]) {
int a = 10;
int b = 5;
printf("修改前 a = %i b = %i\n",a,b);
change(&a,&b);
printf("修改后 a = %i b = %i\n",a,b);
return 0;
}
Return的作用
1.返回值给调用者
2.结束函数
注意点:return 后面不可以写任何语句,因为执行不到
//指针练习
int main(int argc, const char * argv[]) {
int a = 10;
int b = 20;
int c = 30;
int Rsum = 0;
int Rcha = 0;
int result = test(a, b, c, &Rsum, &Rcha);
printf("result = %i\n Rsum = %i\n Rcha = %i\n",result,Rsum,Rcha);
return 0;
}
int test(int v1,int v2,int v3, int *p1, int *p2)
{
int sum = v1+v2+v3;
*p1 = sum;
int cha = v1-v2-v3;
*p2 = cha;
int pingjun = sum/3;
return pingjun;
}
指针为什么要分类型
指针为什么要分类型,因为当我们利用指针去取值的时候,系统就会自动根据指针的类型来确定应该取多少个字节中的值
指针和数组
指针类型的两个用途:
1.取值的时候,会根据指针类型所占用的字节去取出对应字节的数据
2.用于做加法运算,指针+1,其实是加上指针类型所占用的长度,如果当前指针类型是int,那么+1本质上就是加上4个字节
int ages[3] ={1,2,3};
int *p ;
p = ages;
printf("p = %p\n",p);
p = p + 1;
printf("p + 1 = %p\n",p);
p = p + 1;
printf("p + 1 = %p\n",p);
只要一个指针指向了数组,那么访问数组就有三种方式
int ages[3] ={1,2,3};
printf("ages[0] = %p\n",ages);
int *p ;
p = ages;
printf("p[0] = %p\n",p);
printf("ages[0] = %i\n",*(p +0));
指针和字符串
//通过数组来保存字符串,那么字符串是一个常量,可以修改,并且存在栈区,相同的字符串会重复分配存储空间
char str[] = "lxc";
str[0] = 'm';
//通过常量来保存字符串,那么字符串是一个常量,不可修改,并且存在常量区,相同的字符串不会重复分配存储空间
char *str2 = "lxx";
str2[0] = 'x';
//通过常量来保存字符串,那
字符串是一个常量,不可修改,并且存在常量区
指针注意点:
1.可以用来定义变量
2.可以用来作为形参的值
3.可以作为返回值
注意当返回值为字符串的时候 一定要记住在函数里声明要用声明常量的方法,如果声明成数组
就存在了栈区,出了作用域就会被释放。声明常量的话就存在了常量区,不会被释放。
指向函数的指针:
函数也会占用一块内存空间,它也有自己的地址,函数的地址保存在函数中,函数名就是函数的地址 == 数组名就是数组的地址
void test()
{
printf("执行了\n");
}
int main(int argc, const char * argv[]) {
printf("test = %p\n",test);
void (*funtionp)();
funtionp = test;//注意不能写成test() //()表示调用一个函数
printf("*funtionp = %p\n",*funtionp);
(*funtionp)();
return 0;
}
/**
指向函数的指针的定义格式
* : 代表是一个指针
funtionp : 代表指针变量的名称,区分
*funtionp : 代表将来指向一个函数
void : 代表将来指定的函数没有返回值
() : 代表将来指向的函数没有返回值
*/
void (*funtionp)();
练习
#include <stdio.h>
int ages()
{
return 10;
}
void sum(int v1, int v2)
{
int result = v1 + v2;
printf("result = %i\n",result);
}
int sum2(int v1, int v2)
{
int result = v1 + v2;
return result;
}
int main(int argc, const char * argv[]) {
int (*ageP)();
ageP = ages;
printf("age = %i\n",ageP());
//age = 10
void (*sump)(int,int);
sump = sum;
sum(10, 20);
//result = 30
int (*sum2p)(int,int);
sum2p = sum2;
printf("sum2 = %i\n",sum2(20, 20));
//sum2 = 40
return 0;
}
练习2
#include <stdio.h>
int sub (int v1 , int v2)
{
return v1 - v2;
}
int sum (int v1 , int v2)
{
return v1+v2;
}
//int (*funtionP)(int ,int)可以理解为 int v3 只不过这个是传递函数,而且调用的时候不可以在后面参数
int demo (int v1, int v2 ,int (*funtionP)(int ,int))
{
return funtionP(v1,v2);
}
int main(int argc, const char * argv[]) {
printf("sum = %i\n",demo(20, 10, sum));
//sum = 30
printf("sub = %i\n",demo(20, 10, sub));
//sub = 10
return 0;
}