黑马程序员-函数
来源:互联网 发布:hadoop编程教程 编辑:程序博客网 时间:2024/05/16 06:28
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
指针是C语言中最重要的知识,如果没有学会指针,就等于没有学过C语言。
在之前我已经学过了直接引用的方法来操作变量,而在一些情况下我们用直接引用的方法不是很方便,
这时我们就要用到指针的知识,来间接操作变量。
指针定义:
格式:变量类型 *变量名;
int *a;double *b;
定义了指针变量a 、b。
* 是一个说明符,再定义指针时可以理解为和int为一体,不属于变量名,没有实际意义。
指针的初始化:
先定义,再初始化:
// 定义int类型的变量a int a = 10; // 定义一个指针变量p int *p; // 将变量a的地址赋值给指针变量p,所以指针变量p指向变量a p = &a;以上是指针最基本的使用方式
定义的同时进行初始化:
// 定义int类型的变量aint a = 10;// 定义一个指针变量p// 并将变量a的地址赋值给指针变量p,所以指针变量p指向变量aint *p = &a;
//定义一个指针pint *p;//为地址赋值p = 1000;
以上这种为指针赋值的方式是错误的,指针只用来村地址,不能拿来存放数据
使用注意:
1.不建议的写法, int *p只能指向int类型的数据
int *p;
double d = 10.0;
p = &d;
2.指针变量只能存储地址
int *p;
p = 200;
3.指针变量未经过初始化,不要拿来间接访问其他存储空间
int *p;
printf("%d\n", *p);
4.定义变量时的*仅仅是一个象征,没有其他特殊含义
int *p;
p = &a;
指针的应用:
指向指针的指针:
int a = 10; int *p = &a; int **pp = &p; // a = 20; // *p = 20; /* (*pp) == p *(*pp) == *p = a **pp == *p = a */ **pp = 20; printf("%d\n", a); //int ***ppp = &pp; /* char a2 = 'A'; char *p2 = &a2;(*pp) == p
*(*pp) == *p = a
**pp == *p = a
清空指针后,不能再间接访问其他存储空间
int a = 10;int *p = &a;p= null;*p = 19; // 错误,清空指针后不能再使用
指针和数组:
1.数组元素的访问方式
int ages[5];
int *p;
p = ages;
1> 数组名[下标] ages[i]
2> 指针变量名[下标] p[i]
3> *(p + i)
2.指针变量+1,地址值究竟加多少,取决于指针的类型
int * 4
char * 1
double * 8
例如一下代码:
#include <stdio.h>void change(int array[]);int main(){ int ages[5] = {10, 11, 19, 78, 67}; change(ages); return 0;}void change(int *array){ printf("%d\n", array[2]); //printf("%d\n", *(array+2));}/*void change(int array[]){ int s = sizeof(array); printf("%d\n", s);}*/void test(){ double d = 10.8; double *dp; dp = &d; printf("dp = %p\n", dp); printf("dp + 1 = %p\n", dp + 1); int ages[5] = {10, 9, 8, 67, 56}; int *p; p = &ages[0]; //p = ages; /* p ---> &ages[0] p + 1 ---> &ages[1] p + 2 ---> &ages[2] p + i ---> &ages[i] */ //printf("%d\n", *(p+2)); printf("%d\n", p[2]); /* for (int i = 0; i<5; i++) { printf("ages[%d] = %d\n", i, *(p+i)); }*/ // printf("%p\n", p); // printf("%p\n", p + 1); // printf("%p\n", p + 2);}
当使用void change(int array[])接收时,array前面没有*它是将数据当做一个数组接收,
如果void change(int *array)时它是将array当做一个指针,前边需要加上*
指针和字符串:
字符串::
1.常量区
存放一些常量字符串
2.堆
对象
3.栈
存放局部变量
定义字符串的2种方式
1> 利用数组
char name[] = "itcast";
* 特点:字符串里面的字符是可以修改的
* 使用场合:字符串的内容需要经常修改
2> 利用指针
char *name = "itcast";
* 特点:字符串其实是一个常量字符串,里面的字符是不能修改
* 使用场合:字符串的内容不需要修改,而且这个字符串经常使用
代码展示:
int main(){ char name[20]; printf("请输入一个字符串\n"); scanf("%s", name); // 'j' 'a' 'c' 'k' '\0' //printf("%c\n", name[3]); //printf("%s\n", name); return 0;}void test2(){ char *name = "jack"; //int ages[5]; char *names[5] = {"jack", "rose", "jake"}; char names2[2][10] = {"jack", "rose"};}void test(){ char name[] = "it"; name[0] = 'T'; //printf("%s\n", name); // "it" == 'i' + 't' + '\0' char *name2 = "it"; char *name3 = "it"; //*name2 = 'T'; //printf("%c\n", *name2); printf("%p\n%p\n", name2, name3); //printf("%s\n", name2);}
指向函数的指针:
要求:
1.看懂语法
2.定义指向函数的指针
double (*p)(double, char *, int);
p = haha;
或者
double (*p)(double, char *, int) = haha;
3.如何间接调用函数
1> p(10.7, "jack", 10);
2> (*p)(10.7, "jack", 10);
代码:
#include <stdio.h>double haha(double d, char *s, int a){ }void test(){ printf("哈哈哈\n");}int sum(int a, int b){ return a + b;}int main(){ int (*p)(int, int); p = sum; //int c = p(10, 11); //int c = (*p)(10, 11); int c = sum(10, 9); printf("c is %d\n", c); return 0;}void test1(){ void (*p)(); p = test; p(); //(*p)(); //test();}
指针占据的内存大小和编译器有关,
32位编译器环境下占据4个字节,也就是32个比特位
64位编译器环境下占据8个字节,也就是64个比特位
- 黑马程序员-字符串函数
- 黑马程序员--数据库函数
- 黑马程序员_SQL 函数
- 黑马程序员-函数
- 黑马程序员_函数
- 黑马程序员_day03 函数。
- 黑马程序员-构造函数
- 6.黑马程序员-函数
- 黑马程序员----函数
- 黑马程序员-函数
- 黑马程序员_函数
- 黑马程序员--函数
- 黑马程序员----构造函数
- 黑马程序员-函数
- 黑马程序员SQL函数
- 黑马程序员:java函数
- 黑马程序员--构造函数
- 黑马程序员_函数
- UIButton--通过代码创建按钮
- JSF 学习资料
- 儿童游戏之动物世界
- NSNotificationCenter的设计模式
- 反射工具类
- 黑马程序员-函数
- 早上吃啥啊?愁!
- 去除dialog的黑边
- 标签页制作
- WARN util.NativeCodeLoader: Unable to load native-hadoop library解决方案
- iOS CoreAudio学习笔记(一)—— Overview of CoreAudio
- 自动生成代码的chm格式帮助文档
- Android UI开发篇之 ViewPager+九宫格布局 实现左右滑动
- unity3d 使用Quaternion 类实现两个简单功能