121
p = &i;
p保存了i的地址,因为p保存i
如果一个指针指向了普通变量,则指针变量完全等同于普通变量
*p 就是以p的内容(i的地址)为地址的变量*p=i
修改p的值不会改变i的值,修改i的值不会改变p的值
指针就是地址
地址就是内存单元的编号
指针变量是存放地址的变量
指针和指针变量是不同的概念
int main (void)
int*p;
int j;
p = &i;
j = *p;
printf("i=%d,j=%d,i,j");
return 0;
122
指针存放复杂的数据结构
快速的存放数据,时间短,耗用内存小
使函数返回一个以上的值
能够方便地处理字符串
直接访问硬件(地址)
是理解面向对象语言中应用的基础
指针是C语言的灵魂
指针定义:
地址:从0开始的非负整数
范围:一般最大内存条为4G
指针分类:
基本类型
指针和数组
指针和函数
CPU可以直接控制内存条
内存条速度快
控制总线,数据总线,地址总线
CPU读取内存条信息,处理完之后返回给内存条,内存条达到一定量时一次性写入硬盘
数据线:传输数据
控制线:控制方向
地址:对应单元
32位电脑:2^32B=4G
范围(0~4^1024—1)
123
指针变量就是存放内存单元编号的变量,指针变量就是存放地址的变量
124
指针的本质是操作受限(只能进行减法)的非负整数
126
#include<stdio.h>
int main (void)
{
int * p;
int i =5;
*p = i;
printf("%d", *p);
return 0;
}
p指向未知地址,*p不一定等于 i
{
int i = 5
int * p;
int * q;
p = &i ;
*q = *p;(越界,没有定义q)
printf(%d\n,*q);
{
int i =5;
int *p;
int *q;
p = &i;
q=p;
printf("%d\n",*q);
但是q有可能内部是垃圾值,所以*q 不能读,没有分配*q的空间
q没有被定义,所以*q的权限不能访问,不能输出*q
动态空间:多个指针b指向同一地址
不能多次释放,程序奔溃
释放一次
free(p)
不释放导致内存泄漏,内存越来越少
127
#include <stdio.h>
void huhuan_1<int a, int b>
{
int t;
t = a ;
a = b;
b = t;
return;
}
int main(void)
{
int a = 3;
int b ==5;
huhuan(a,b);
printf("a = %d, b = %d\n", a, b)
#include<stdio.h>
void huhuan_2(int * p, int * q)
{
int *t
*t=a;
a=b;
b=t;
}
int main (void)
{
a = 3;
b = 5;
huhuan_2(&a,&b);
printf(a = %d,b = %d\n, a,b);
return 0 ;
}
只是换了形式参数pq保存的地址,没有更改ab的地址,ab的值也没变
#include <stdio.h>
void huhuan_3(int*p,int*q)
{
int t
t = *p;
*p = *q;
*q = t;
}
int main(void)
{
int a = 3;
int b = 5;
huanhuan_2(&a,&b);
printf("a=%d,b=%d\n,a ,b)
return 0;
}
调用函数里面的变量名称类型要和形式参数里面的变量类型一样
128
*含义:乘法
定义指针//定义一个名字叫p的变量,int*表示p只能存放int的地址
指针运算符:该运算符放在已经定义好的指针变量前面,如果p是一个已经定义好的指针变量,则*p表示以p为地址的变量
129
单引号用在字符A
双引号用在字符串上
实参和形参不是同一个变量
字符(里面有逗号)说明有形参
首先为形参分配空间,所以一定是不同的变量。把实参的值发送给形参,执行完函数之后,执行printf语句,此时空间已经被释放
地址用pq,整型用i,浮点型用xy,指点型用pqrs
实参变量名发送给形参变量名
#include <stdio.h>
void swap_2(int * p,int * q)
{
int t;
t = *p;
*p = *q;
*q = t;
}
int main(void)
int a =3;
int b = 5;
swap_2(&a, &b);
printf(a = %d, b=%d \n,a , b);
return 0 ;
}
include <stdio.h>
int main(void)
int *p;
int i=5;
char ch='A';
p = &i;
*p = 99;
printf("i = %d,p = %d\n,p ,i);
return 0 ;
}
return 是结束的意思,只能执行一次return,f只能返回一个值,只能修改一个值
如何通过被调函数修改主调函数的值
实参必须为该普通变量的地址
形参必须为指针变量
在被调函数中通过*形参名的方式就可以修改主调函数相关变量的值