指针概述
所有的变量都会在内存空间分配一块内存,指针是用来表示这块内存空间的地址的,可以用取地址符&来获取一个变量在内存空间的地址,如果想存放一个地址,就可以用一个指针变量来存放,存放内存地址的变量就是指针变量
指针是用来表示一块内存地址的,指针变量是用来存放内存地址的
#include <stdio.h>#include <stdlib.h>main(){int i = 10;int* p = &i;printf("%#x\n",p);//p = NULL;//printf("i=%d\n",i);//i=10//printf("*p=%d\n",*p);//*p=10//*p = 100;//printf("i=%d\n",i);//i=100i = 90;printf("*p=%d\n",*p);//*p=90/**总结p是一个指针变量,存储的是i的内存地址*p和i其实代表的是同一块内存空间*/system("pause");}
值的交换
#include <stdio.h>#include <stdlib.h>
//形参i,j等于是重新开辟了两块内存地址更跟实参i,j已经没有什么关系了
void swap(int i,int j){
int temp;
temp = j;
j = i;
i = temp;
}
//p,q和i,j代表的都是同一块内存地址
void swap_pointer(int* p,int* q){
int temp;
temp = *q;
*q = *p;
*p = temp;
}
main()
{
int i = 10;
int j = 30;
printf("交换前...\n");
printf("i=%d\n",i);
printf("j=%d\n",j);
//swap(i,j);
swap_pointer(&i,&j);
printf("交换后...\n");
printf("i=%d\n",i);
printf("j=%d\n",j);
system("pause");
}
指针当中的常见错误
#include <stdio.h>#include <stdlib.h>
main()
{
/**垃圾指针,野指针*/
//int* p;//p还未指向任何内存空间,不能够被使用
//printf("*p=%d\n",*p);
//*p = 2425;
/**类型的不同的指针不可以相互转换*/
int i = 9999;
char* c;
c = &i;
printf("*c=%c\n",*c);
system("pause");
}
不可使用已回收掉了的指针变量
#include <stdio.h>#include <stdlib.h>
//函数完成时i将会被回收
void func(int** q){//代表的是指针变量的指针变量
int i = 3;
*q = &i;//*q代表的是指针变量p
}
main()
{
int* p;
printf("p的内存地址为%#x\n",p);
printf("i=%d",*p);//注:有可能在i还未被回收时获取到值
system("pause");
}
通过传递指针变量让子函数修改主函数中变量的值
字符串和数组#include <stdio.h>#include <stdlib.h>
//可以通过传递指针变量的方式,在子函数中修改主函数中变量的值void func(int* p,int* q){*p = 100;*q = 200;}
main(){int i = 10;int j = 20;func(&i,&j);printf("i=%d\n",i);printf("j=%d\n",j);system("pause");}
#include <stdio.h>#include <stdlib.h>
/**
数组是一块连续的内存空间
数组的名字代表的是数组的首地址和arr[0]的内存地址是一样的
后续元素的内存地址都是在首地址的基础上后移
arr[0] == *(arr+1)
*/
//打印数组中的每一个元素
void printArr(int* arr,int len)
{
int i=0;//c99版本中必须在外面进行初始化
for(;i<len;i++)
{
printf("arr[%d]=%d\n",i,*(arr+i));
}
}
main()
{
//字符串数组
char carr[20] = {'a','b','c','\n'};
printf("carr=%s\n",carr);
printf("carr=%#X\n",&carr);
printf("&carr[0]=%#X\n",&carr[0]);
printf("carr[1]=%c\n",*(carr+1));
//char指针类型来代替字符串
//char* arr1 = "abc\n";
//printf("arr1=%s",arr1);
int arr[5] = {1,2,3};
printf("arr=%#x\n",arr);
printf("&arr[0]=%#X\n",&arr[0]);
printf("arr[1]=%d\n",*(arr+1));
printArr(arr,5);
system("pause");
}
指针的运算
指针占多少个字节#include <stdio.h>#include <stdlib.h>/**指针的运算并不是向上或向下移动一个字节而是按照约定的类型,移动约定的类型的字节数*/main(){//char类型在内存中占一个字节char charArr[4] = {'a','b','c','d'};char* cp = &charArr[2];printf("*(cp-1)=%c\n",*(cp-1));//int类型在内存中占4个字节int intArr[4] = {1,2,3,4};int* ip = &intArr[2];printf("*(ip-1)=%d\n",*(ip-1));system("pause");}
#include <stdio.h>#include <stdlib.h>main(){int i = 2;float f = 2;double d = 2;char c = 'b';int* ip = &i;float* fp = &f;double* dp = &d;char* cp = &c;printf("int指针占的长度为%d\n",sizeof(ip));printf("float指针占的长度为%d\n",sizeof(fp));printf("double指针占的长度为%d\n",sizeof(dp));printf("char指针占的长度为%d\n",sizeof(cp));/**int指针占的长度为4float指针占的长度为4double指针占的长度为4char指针占的长度为4*//**32位操作系统最大表示的内存空间为2的32次方指针只需要4位 就可以表示出来所有的内存空间64位操作系统,当编译器支持64位时,指针所占的长度为8byte*/system("pause");}
函数指针
#include <stdio.h>#include <stdlib.h>
int add(int x,int y)
{
printf("x+y=%d\n",x+y);
}
main()
{
//函数指针
int (*pFunc) (int x,int y);
pFunc = add;
pFunc(4,9);
system("pause");
return 0;
}