AutoLeaders 控制组——指针个人笔记

目录

P82.取地址运算 

P83.指针

P84.指针的使用

P85.指针与数组

P86.指针与const

P87.指针的运算

P88.动态内存的分配


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,会导致运行内存下降;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值