带你了解C语言指针
2016-08-04 19:51
351 查看
C语言指针是学习C语言必备的知识点,这里结合实例详细讲解C语言指针。
C语言指针
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;
}
原文来自:博客园/偷吃的喵
C语言指针
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;
}
原文来自:博客园/偷吃的喵
相关文章推荐
- C语言:用异或^实现数据加密
- 如何理解C语言数组
- C语言基础学习教程
- STL编程题1(C++程序设计第1周)
- 8.4总结
- C语言二维数组(第十天)
- RunTime详解-------
- c/c++第十天
- c++避免内存泄漏
- leetcode_c++: Integer to Roman(012)
- C++中的istringstream 的用法 HDU 2072单词数
- C语言学习6
- C语言 二维数组
- C++之stl::string写时拷贝导致的问题
- leetcode_c++: Regular Expression Matching(010)
- SkipList跳表的实现
- C语言_动态链表的简单建立与节点删除
- C++连续输入带空格的字符串
- c++之内存管理
- 极客班 c++(下)第一周学习笔记 ——new & delete