目录
P82.取地址运算
1.&是运算符,可以取出变量的地址;(获得变量的地址,它的操作数一定是变量)
2.如printf(“%p”,&i),做地址的输出时用“%p”,后面的“i”前加上“&”才完整;
3. %x本用于输出16进制数,但也可以用于输出地址;
4.在不同位数的操作系统,&i所占字节数不同;
5.&不能对没有地址的东西取地址:&(i++) 或&(++i) 或&(i+p)都不行
6.相邻的变量地址相差4,且越早定义的地址越大;(变量在堆栈里从顶至下分配)
7.数组中,&a和&a[0]和a地址一致;
P83.指针
1.指针就是保存地址的变量;(int*p=i)
2.int*p,q中“q”只是一个int类型的整数,如果要定义两个指针,应写成int*p,*i;
3.相较于普通变量,指针变量的值是实际值的变量的地址;
4.厘清概念:
*是一个单目运算符,用于取出地址里的值;
p是指针,但必须与*才成为指针;
&是一个单目运算符,用于取出变量的地址;
*p是表示地址中被取出的值;
5.由“4.”我们可以判别以下两个运算的区别:
(&和*为互相反作用)
P84.指针的使用
1.指针的用处就是配合函数,使得函数里的计算结果可以作用于块外;
例如实现在函数内的值互换:
2.函数返回运算状态,指针返回结果:
例如:
注释:1.函数divide返回判断状态的0或1,而指针返回正常状态下运算的结果。
2.if语句里如果divide==1,则进入printf;
3.易错点
int*p必须先给一个坐标进行初始化,不能直接赋予一个值。
即int*p=1是错误的,会导致程序崩溃!
4.老师的骚操作*
让机器为我们数数:
sizeof(a)/sizeof(a[0])
P85.指针与数组
1.一些概念:
1.
2.注意:
3.数组本身为指针,但其中的的每个单元不是,因此要用&取地址;
4.[]也可以对指针做;
5.数组不能相互赋值:
即数组不可赋值但可以改变其中的单元的值;
P86.指针与const
1.例如:int const*i=&q;
则i指向的地址可变,即i=&r是可行的;
而*i=26不可行,因为其改变了*i的值;
2.区分:
const int*i;
int const*i;
int *const i;
其中第一和第二相同,表示*i的值不可变;而第三表示i指向的地址不可变;
如图:
3.拓展
4.作用
我们总是可以把一个非const的值转换成const的
当要传递的参数的类型比地址大的时候,这是常用的手段:既能用比较少的字节数传递值给参数,又能避免函数对外面的变量进行修改
例如:
void f(const int* x); //值不变,地址可变
int a = 15;
f(&a); // ok
const int b = a;
f(&b); // ok
P87.指针的运算
1.给一个指针加一,表示让指针指向下一个连续的地址;
如果是int*型的指针则地址加四,如果是char*型则地址加一;
2.*p++表示先取出p指向地址的值,再令p指向下一个连续的地址;
3.新的遍历方式:
int a[]={1,2,3,4,5,6,7,8,9,-1};
int *p=a;//a本身就是指针
while(*p!=-1){
printf("%d ",*p++);
}
4.<,<=, ==,>, >=, != 都可以对指针做;
实际是比较它们在内存中的地址;
数组中的单元的地址肯定是线性递增;(不同于其他变量)
5.无论指向什么类型,所有的指针的大小都是一样的,因为都是地址;
但是不同类型的指针不可以是直接互相赋值的;
这是为了避免用错指针;
6.总结指针的作用:
P88.动态内存的分配
1.头文件:#include <stdlib.h>;
void* malloc(size_t size);
向malloc申请的空间的大小是以字节为单位的;
返回的结果是void*,需要类型转换为自己需要的类型;
(int*)malloc(n*sizeof(int))
2.注意最后要free:
#include <stdio.h>
#include<stdlib.h>
//malloc的头文件
int main(){
int number;
int *a;
int i;
printf("请输入数组元素数量:");
scanf("%d", &number);
a = (int*)malloc(number*sizeof(int)); //申请一块内存空间
for(i=0; i<number; i++){
scanf("%d", &a[i]); //此时申请来的空间可以当数组使用
}
for(i=number-1; i>=0; i--){
printf("%d ", a[i]); //逆序输出数组
}
free(a); //释放空间
return 0;
}
3.长时间运行且不用free,会导致运行内存下降;