#include
#include
int main()
{
//指针变量实现间接访问,为了配合函数调用
int i=10,j;
int* p; //指针定义:存放变量地址
p=&i;//取i的地址,也叫引用i,整形指针存放整形指针地址,无法取其他类型
printf("*p=%d",*p);//将i地址存放的内容打印出来 10
return 0;
}
指针做形参
#include
#include
void change(int* i) //接收i的指针
{
*i=5; //取i的地址的内容,赋值5
}
void pointer_trans()
{
int i=10;
printf("before change i=%d\n",i);
change(&i);//传入i的地址,也就是指针
printf("before change i=%d\n",i);
}
int main()
{
pointer_trans();
return 0;
}
指针偏移
#include
#include
#define N 5
void print(int *p)
{
for(int i=0; i<N; i++)
{
printf("%3d",*(p+i)); // 1 2 3 4 5
}
}
void pointer_move()
{
//指针偏移,每次偏移 按类型不同,偏移不同 sizeof(a) 个大小
int a[N]= {1,2,3,4,5};//数组本身是一个指针变量,可以当指针传入
int *p;
p=a;
for(int i=0; i<N; i++)
{
printf("%3d",*(p+i)); // 1 2 3 4 5
}
printf("\n");
print(a);
}
int main()
{
pointer_move();
return 0;
}
一道练习题
#include
#include
#define N 5
void pointer_self_add()
{
int a[3]={2,7,8};
int *p;
int j;
p=a;
j=*p++; //先j=*p j=a[0], p++后 *p=7
printf("a[0]=%d,j=%d,*p=%d\n",a[0],j,*p);//2,2,7
j=p[0]++; //先j=p[0]=7 因为p[0] 为p指向的第一个元素,前面p++故p指向数组中元素7
//p[0]的元素值为7 ,7++变为8,故p[0]=*p=8,由于p[0]的值被修改故,a[1]的值被修改a[1]变为8
printf("a[1]=%d,j=%d,*p=%d\n",a[1],j,*p);//8 7 8
}
int main()
{
pointer_self_add();
return 0;
}
野指针
#include
#include
#include
void use_malloc()
{
int len;
char *p;
scanf("%d",&len);
p=(char*)malloc(len);//申请空间
strcpy(p,"hello");
puts(p);
free(p);
}
void wild_pointer()
{
int *p1,*p2,*p3;
p1=(int*)malloc(4);
*p1=1;
p2=(int*)malloc(4);
*p2=2;
free(p1); //野指针free了一个指针,但是这个指针没有赋值NULL,即野指针
p3=(int*)malloc(4);//p3继承p1空间
*p3=3;
printf("*p3=%d\n",*p3);//3
*p1=100; //由于p1还指向那块空间,所以p1可以更改
printf("p3=%d\n",*p3);//100
}
int main()
{
wild_pointer();
return 0;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)