- 基本数据类型作为值传递,值不变;
- 指针变量格式:变量类型 *变量名;指针变量只能存储地址;
- &a就是取普通变量的地址;
- p= &a表示指针变量p指向了变量a;指针变量占据8个字节;
- *p = 10; 因为之前把a的地址赋值给了p;,所以对p进行赋值就会间接改变a的值;
- 我有了你的地址,我就可以改变你的值;指针变量的工作就是存储地址;
- 指针就一个作用:能够根据一个地址值,访问对应的存储空间;
- int *p; 表示指针变量只能指向整型数据的变量;
- 指针变量的作用间接实现了多返回值的作用;
- .
指针的使用注意:
- 不建议写法1:int *p; double d = 10.0; p = &d;因为类型不一样;
- 不建议写法2:int *p; p= 200; 200不能作为指针地址;指针变量只能存储地址;
- 注意3:int *p; printf("%d,*p"); 指针变量未经过初始化,不要拿来间接访问其他存储空间;
- 注意4:*p在赋值之后代表的是存储空间; int *p=&a;
- 不正确写法5: *p= &a; 正确的写法是 p= &a; 可以是 *p=‘a’;
- 定义变量时的*仅仅是一个象征,没有其他特殊的含义;
指向指针的指针;
- int a = 20;int *p =&a;int **pp=&p;int ***ppp=&pp;
- 一级指针经常用,二级指针都很少用了;
指针与数组
- %d int;%f floatdouble;%ld long;%lld long long;%c char ;%s 字符串; %zd unsigned long;
- 在64位编译器下,任何指针都只占用8个字节的存储空间;
- %p可以查看地址值;
- 对数组元素的访问有几种方式:1》用数组名来访问:数组名【下标】ages【1】2》用指针做为数组来访问:指针变量名【下标】p【1】3》用*(p+i)来访问;
- 指针变量的+1究竟加多少,取决于指针的类型;如果是int的指针类型+1代表加4;如果是double类型的指针,+1代表加8;
- 利用一个指针来接受一个数组,指针变量array指向了数组的首元素;
指针与字符串
- %s可以输出字符窜直到遇到
- 利用数组定义字符串:char name[]="it"(字符串变量 ,可以改);利用指针定义字符串:char *name2 = "it"(字符串常量 ,不能改,放在常量区;经常使用;)
- 内存可以分成两块:常量区(存放一些常量字符串);堆(存放对象);栈(存放局部变量);
- 字符串变量;字符串常量;
- 指针数组(字符串数组)char *names[5] = {"jack","rose","jake"}
- char name[20];printf("请输入姓名: ");scanf("%s",name);printf("刚才输入的字符串是:%s ",name);
- 注意:数组里面的scanf不用写&;
返回指针的函数:
- 只需要看懂语法就行;
- char *test(){return "rose"};这个函数为什么有指针;说明这个函数返回的值类型是char *;就是rose这个字符串;
- char test(){return "A"};就表示返回值是char类型,就是单字节;
指向函数的指针
- 说明函数也有地址;
- void(*p)();(*p)是固定写法,代表指针变量p将来肯定是指向函数;左边的void:表示指针变量p指向的函数没有返回值;右边的()表示指针变量p指向的函数没有形参;
- 函数名代表函数地址;数组名代表数组的地址;
- void(*p)();p=test;(*p)();这个是利用指针变量间接调用函数;也可以写成p( );
- char *是传字符串;