指针
- 什么是指针
例子
#include<stdio.h>
int main()
{
int * p;//p是变量的名字,int *表示的是p存放的是int类型的地址
int i = 3;
p = &i;//表示p保存了i的地址,且p指向i,但p不是i所以修改i不影响p
return 0;
}
1.指针就是地址,地址就是指针,
2.地址是储存内存单元的编号
3.指针变量是存放地址的变量
4.指针只是一个值(内存单元的编号)、一个编号
5.指针变量和指针是两个不同的概念
6.指针的本质是一个操作受限的非负整数
指针的重要性
1.表示一些复杂的数据结构
2.快速的传递数据
3.是函数返回一个以上的值
4.能直接访问硬件
5.能够方便的处理字符串
6.是理解面向对象语言中引用的基础
什么是内存
1.从零开始的非负整数
2.内存单元的编号
指针常见错误
# include<stdio.h>
int main()
{
int i = 5;
int * p;
int * q;
p = &i;
//*q = p;错误
//*q = *p;错误
p = q;//q是垃圾值,q付给p,p也变垃圾值
printf("%d\n",*q);//q内部是垃圾值则会出错因为本程序没有*q此时所代表的内存单元的控制权限
return 0;
}
指针经典程序
#include <stdio.h>
void exchange(int *p, int *q)
{
int t;
t = *q;
*q = *p;
* p = t;
}
int main()
{
int a = 5;
int b = 3;
exchange(&a, &b);
printf("a=%d b=%d", a, b);
return 0;
}
星号的含义
1.乘法
2.定义指针
3.间接运算符(指针运算符)
- 如果p已经是一个指针变量则*p表示的是以p的内容为地址的变量
一维数组和指针的关系
1.一维数组名是个指针常量存放的是一维数组第一个元素的地址
一个函数要处理一维数组需要处理该数组的哪些信息,即确定一个一维数组要几个参数
- 需要数组名和元素个数
一个指针变量占几个字节
#include <stdio.h>
int main()
{
char ch = 'a';
int c = 34;
double d = 78;
char *e = &ch;
int *r = &c;
double * t = &d;
printf("%d %d %d", sizeof(e), sizeof(r), sizeof(t));
return 0;
}
/* 指针变量占几个字节?
指针即为地址,指针几个字节跟语言无关,而是跟系统的寻址能力有关,以前是16为地址,指针即为2个字节,32位系统,所以是4个字节,现在64位,则就为8个字节。
-------------
输出结果
8 8 8
-------------
*/
动态内存分配
传统数组的缺点
1.数组长度必须事先制定,且只是常整数
2.传统数组的内存程序员无法手动释放在一个函数运行期间,系统为该函数分配的空间会一直被占用直到该函数运行完毕
3.数组的长度一旦定义就不能在更改
4.A函数定义的数组,在A函数运行期间可以被其他函数使用但当A函数结束后便不能使用
5.传统数组不能跨函数运行
为什么需要动态内存分配
动态数组很好解决了以上的问题
传统数组叫做静态数组
1.malloc函数只能返回第一个字节的地址
2.malloc只有一个形参,且为整型
3.int * p=(int *)malloc(4)分配了八个字节
动态内存和静态内存的比较
1.静态内存是是系统自动分配,由系统自动释放
2.静态内存是在栈分配的
3.动态内存是程序员手动分配,手动释放
4.动态内存是在堆分配的
动态内存举例
#include <stdio.h>
#include <malloc.h>
int main()
{
int len;
int *t;
int i;
printf("plase write down your number\n");
scanf("%d", &len);
t = (int *)malloc(4 * len);
for (i = 0; i < len; ++i)
scanf ("%d", &t[i]);
for (i = 0; i < len; ++i)
printf ("%d ", t[i]);
return 0;
}
课后习题
10.12.1
#include <stdio.h>
int main(void)
{
int ref[] = { 8,4,0,2};
int *ptr;
int index;
for(index = 0,ptr = ref;index < 4;index++,ptr++)
printf("%d %d\n",ref[index],*ptr);
return 0;
}
/*
输出结果为
---------
8 8
4 4
0 0
2 2
---------
*/
10.12.2
ref中有四个元素
10.12.3
ref地址就是是ref[0]的地址,ref + 1表示 ref[1]的地址,++ref无指向
10.12.4
a
ptr 值是12
*(ptr + 2)的值是16
b
ptr 值是12
*(ptr + 2)的值是1
10.12.5
a
**ptr的值是12
**(ptr+1)是16
b
ptr的值是12
*(ptr+1)是14