指针概述
所有的变量都会在内存空间分配一块内存,指针是用来表示这块内存空间的地址的,可以用取地址符&来获取一个变量在内存空间的地址,如果想存放一个地址,就可以用一个指针变量来存放,存放内存地址的变量就是指针变量
指针是用来表示一块内存地址的,指针变量是用来存放内存地址的
#include
#include
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=100
i = 90;
printf("*p=%d\n",*p);
//*p=90
/**
总结
p是一个指针变量,存储的是i的内存地址
*p和i其实代表的是同一块内存空间
*/
system("pause");
}
值的交换
#include #include
//形参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 #include
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 #include
//函数完成时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
#include
//可以通过传递指针变量的方式,在子函数中修改主函数中变量的值
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 #include
/**
数组是一块连续的内存空间
数组的名字代表的是数组的首地址和arr[0]的内存地址是一样的
后续元素的内存地址都是在首地址的基础上后移
arr[0] == *(arr+1)
*/
//打印数组中的每一个元素
void printArr(int* arr,int len)
{
int i=0;//c99版本中必须在外面进行初始化
for(;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
#include
/**
指针的运算并不是向上或向下移动一个字节
而是按照约定的类型,移动约定的类型的字节数
*/
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
#include
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指针占的长度为4
float指针占的长度为4
double指针占的长度为4
char指针占的长度为4
*/
/**
32位操作系统最大表示的内存空间为2的32次方
指针只需要4位 就可以表示出来所有的内存空间
64位操作系统,当编译器支持64位时,指针所占的长度为8byte
*/
system("pause");
}
函数指针
#include #include
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;
}