指针
1、int a 表示整数a
2、int *a 指向整型的地址,名称叫a(一级指针,表示a所指向的地址里面存放的是一个int类型的值)
3、int* a 整形的指针,名称叫a
4、int **a 二级指针,表示a所指向的地址里面存放的是一个指向int类型的指针
2和3在用法上没有区别,理解上有区别:前者表示a地址指向的类型是整型,后者表示a是整个整形的指针,用起来的效果是一样的(学习时无需多虑)
通俗来讲:*和&是互逆的,&表示取地址符,*是访问里面的东西,&表示获取地址。
指针就像是酒店的房卡,客人表示数据,房卡上面存放着房间号(即客人的地址),来访人员经过房卡找到房间号,从而访问数据,
#include<stdio.h>
void main()
{
int *x,*y; /*定义指针变量(变量的指针:存储变量的地址,指针变量:存储指针的变量)*/
int a,b;
x = &a;
y = &b;
scanf("%d%d",&a,&b);
printf("%d %d",*x,*y); /*号代表通过操作对象的地址,获取操作对象存储的内容,*x代表通过a的地址
获取a的内容*/
}
指针变量指的是x,y,而不是*x,*y 定义的是整数类型的指针变量x,y.(因为我自己初学时经常搞混,所以强调一下)。
举例:用指针定义函数,用以找出两数最大值
#include<stdio.h>
void *max(int* x,int* y)
{
int* t;
if(*x>*y) /*若地址x存储的数据大于地址y存储的数据,则返回x的地址*/
t = x;
else
t = y;
return t;
}
int main()
{
int a,b,*p;
scanf("%d%d",&a,&b);
p = max(&a,&b); /*函数调用的是指针(即数据的地址)*/
printf("max = %d",*p); /*返回的是地址,访问里面的值要用‘*’ */
return 0;
}
避免访问野指针:
#include<stdio.h>
int main()
{
int *a;
*a = 123;
}
/*此种类型为野指针,因为指针a未初始化,虽然已经为*a赋值,但不知道该指针指向哪个地址*/
指针和数组
一、数组名就是一个地址信息(第一个元素的地址)
#include<stdio.h>
int main()
{
int str[123];
printf("input your name:");
scanf("%s",str);/*没用&*/
printf("your name is:%s\n",str);
return 0;
}
/*输入:CSDN 输出:CSDN*/
二、指向数组的指针
char *p;
p = a;//语句1
p = &a[0];//语句2
三、指针的运算
当指针指向数组是可以对指针进行加减运算,意义是距离指针所知位置向前或向后第N个元素
#include<stdio.h>
int main()
{
char *p;
char name[40];
p = name;
scanf("%s",name);
printf("*p=%c *(p+1)=%c *(p+2)=%c",*p,*(p+1),*(p+2));
return 0;
}
/*输入:CSDN 输出:*p=C *(p+1)=S *(p+2)=D */
注意这里的+1不是将p指向的地址+1,而是让指针p指向下一个元素
指针和数组的区别
数组名就是一个地址,指针是一个左值(左值:可以被复制的变量)
四:指针数组和数组指针
int *p1[5]; /*指针数组*/
int *(p2)[5]; /*数组指针*/
运算优先级:[ ]>*
‘p1’先被定义为数组,再是一个指针(指针数组是一个数组,每个数组元素存放一个指针变量)
#include<stdio.h>
#include<string.h>
int main()
{
char *p1[5] = {"EDG","CHAMPION","WORLDE"};
int i;
for(i=0;i<3;i++)
{
printf("%s ",p1[i]);
}
return 0;
}
/*输出:DEG CHAMPION WORLDE*/
数组指针
int (*p2)[5];
运算优先级:()>[ ]
一个指向一整个数组的指针(而不是仅指向第一个数组元素)
/*有些同学在使用数组指针时会这样定义*/
#include<stdio.h>
int main()
{
int data[5];
int (*p2)[5] = data;
for(int i=0;i<5;i++)
{
printf("%d ",(*p2)[i]);
}
return 0;
}
/*此时程序会报错,因为这位同学忽略了数组名data仅表示数组第一个元素的地址,而这里的数组指针表示整个数组*/
正确应写为:
#incldue<stdio.h>
int main()
{
int data[5] = {1,2,3,4,5};
int (*p2)[5] = &data; /* P2表示地址的地址*/
for(int i=0;i<5;i++)
{
printf("%d ",*(*p2+i)); /* *p2+i表示数组中第i个元素的地址*/
}
return 0;
}
/*输出:1,2,3,4,5*/