hort s = 278;
int i = 2777777; //4个byte
int* p = &i;
short* q = &i; // short 在内存空间里面占用的是两个 byte
printf("*p=%d\n",*p);
printf("*q=%hd\n",*q);
system("pause");
}
3、不能使用已经被系统回收掉的内存空间里的数据:
六、案例:交换两个数字.
通过修改地址里面的值 达到了交换数据的目的
#include
void swap2(int* p, int* q){//p代表的是 i的地址, q代表的是 j的地址
// 把i变量和 j变量的地址 传递给了子函数,在子函数里面直接通过修改地址里面的值 达到了交换数据的目的
// *p 代表的就是 i变量
// *q 代表的就是 j变量
int temp;
temp = *p;
*p = *q;
*q = temp;
}
//主方法
main(){
int i = 3;
int j = 5;
// swap(i,j);
swap2(&i,&j);
printf("i=%d\n",i);
printf("j=%d\n",j);
system("pause");
}
七、指针的作用:
1、直接访问硬件 (opengl 显卡绘图)
2、 快速传递数据(指针表示地址)
3、 返回一个以上的值(返回一个数组或者结构体的指针)
例:在子函数中同时修改两个变量对应的值:
#include
//相当于是让子函数 修改了主函数里面连个数据的值, 子函数返回一个以上的数据
void f(int* p , int* q){ // p表示的是i的地址, q代表的是 j的地址
*p = *p+3;
*q = *q+3;
}
main(){
int i = 3;
int j = 5;
f(&i,&j); //调用子函数
printf("i=%d\n",i);
printf("j=%d\n",j);
system("pause");
}
4、 表示复杂的数据结构(结构体)
5、 方便处理字符串
// c语言是没有String类型的 要在c语言里面表示一个字符串 一般都是通过字符数组的方式表示
#include
main(){
// char arr[]={'h','e','l','l','o'};
//char类型的指针变量
char* arr ="hello";
//输出字符传
printf("%s\n",&arr[0]);//arr[0]字符数组的首地址。
system("pause");
}
6 、指针有助于理解面向对象
八、指针和数组之间的关系:
1、数组:
数组在内存中是一块连续的内存空间。
数组的名称 等于数组中第一个元素的地址(首地址)。
int arr[]={1,2,3,4};
printf("arr = %#x \n",arr);
printf("第一个元素的地址为%#x\n",&arr[0]);
上面两行代码输出的值相同。
2、指针操作数组:
例:开发一个子方法 把数组的每一个元素都打印出来
#include
// 第一个参数 数组的首地址, 第二个参数 数组的长度
void printArr(int* parr , intlen){
int i;
for( i=0;i
//输出方式一:根据数组的下标获取数组中的值:
printf("arr[%d]=%d\n",i,parr[i]);
// *parr //数组第一个元素对应的内容
//*(parr+1) 获取数组第二元素对应的内容(因为内存是连续的空间)
printf("arr[%d]=%d\n",i,*(parr+i));
}
}
main(){
int arr[]={1,2,3,4,5,6,7,8,9};
printArr(arr,9);
system("pause");
}
九、指针的运算:
1、指针的运算只对连续的内存空间才有意义,数组是一块连续的内存空间:
例:数组元素指针之间的运算:
#include
main(){
//数组是一块连续的内存空间
int intarr[] = {1,2,3,4,5,6,7,8,9};
// int* arr0 = &intarr[0];
int* arr0 = intarr;//数组第一个元素的地址
int* arr1 = &intarr[1];
int* arr2 = &intarr[2];
printf("arr0地址为%#x\n",arr0);
printf("arr1地址为%#x\n",arr1);
printf("arr2地址为%#x\n",arr2);
printf("arr2与arr0之间的距离为%d\n", arr2 - arr0);
// 指针的运算 相减和相加得到的结果其实都是 内存地址的偏移量,不是单纯的内存地址整数加减结果.结果代表的有特殊的业务含义, 几个内存空间之间的偏移量.
char chararr[] ={'1','2','3','4','5'};
// int* arr0 = &intarr[0];
char* chararr0 = chararr;//数组第一个元素的地址
char* chararr1 = &chararr[1];
char* chararr2 = &chararr[2];
printf("chararr0地址为%#x\n",chararr0);
printf("chararr1地址为%#x\n",chararr1);
printf("chararr2地址为%#x\n",chararr2);
printf("chararr2与chararr0之间的距离为%d\n", chararr2 - chararr0);
system("pause");
}
九、指针的长度:
#include
main(){
//在32位的操作系统上, 2的32次方个内存地址 4个byte
// 在我当前的32电脑操作系统上 用的devcpp工具, gcc
int i =3;
int* ip = &i;
double d = 3.14159;
double* dp = &d;
float f = 6.28f;
float* fp = &f;
short s = 255;
short* sp = &s;
//指针的长度都为4。
printf("int的指针长度为%d\n", sizeof(ip));
printf("double的指针长度为%d\n",sizeof(dp));
printf("float的指针长度为%d\n",sizeof(fp));
printf("short的指针长度为%d\n",sizeof(sp));
system("pause");
}
十、动态内存和静态内存:
1、动态内存
动态内存创建在堆空间上的 一块不连续的内存空间 可以占用整个操作系统的全部内存
堆内存就是操作系统维护的剩余的内存空间,
在java里面new出来的的所有的对象都是分配在堆内存里面。
在C语言里面,申请堆内存空间使用malloc 函数。
malloc函数接受一个参数 ,参数代表动态的在堆内存申请多大的内存空间.
malloc的返回值 代表的是申请的这块内存空间的首地