指针格式:
存储类型 数据类型 *指针变量名;
数据类型: 代表指针所指空间存放的数据的数据类型
int *p; //定义了一个指向int类型数据的指针变量p
int main(int argc, char const *argv[])
{
int a[10] = {1, 2, 3, 4, 5};
int *p = a; //*p变量,a地址常量
for (int i = 0; i < 10; i++)
// printf("%d ",*(p+i));
// printf("%d ",p[i]);
// printf("%d ",*(a+i));
printf("%d ", a[i]);
printf("\n");
for (int i = 0; i < 10; i++)
printf("%d ", *p++);
}
注释:常量不可以改变
访问指针所指空间的内容时用取内容运算符*
那么变量p存放的就是a的地址,q变量存放的是b的地址。
通过运算符*就可以访问地址所表示空间里面内容。
指针操作符和初始化
&:取变量的地址
*:取地址里的内容
*&a = a; //*和&是互逆运算(可以抵消)
&*a; //错误 (原因:运算符优先级)
2.1初始化:
《1》:将普通变量的地址赋给指针
int a=5;
int *p=&a;
printf("%d%d\n",*p,a);
<2>j将数组的首地址给指针变量
<3>将指针变量里面存放的地址赋给另一个指针
int main()
{
int a=5;
int *p=&a;
int*q=p;
printf("%d %d %d\n",a,*p,*q);
}
指针的运算:
int main(int argc, char const *argv[])
{
int a[10] = {1, 2, 3, 4, 5, 6,8};
int *p = a;
int *q = a + 5;
printf("%d %ld\n",*(p+5), q - p);
if(q>p)
printf("%d ",*(q+1)-*p+2);
return 0;
}
p+n: 访问高地址方向的第n个数据的地址,指针指向不改变。
p-n: 访问低地址方向的第n个数据的地址,指针指向不改变。
指针偏移
字节
偏移了多少字节 = 偏移量*sizeof(数据类型)
两个地址之间的差= 两个地址之间相隔元素的个数
p-q = 直接按相隔元素个数
关系运算:
注释:比较地址的高低,所以应该在同一个数组里进行比较
int x[] = {10, 20, 30};
int *px = x;
printf("%d,", ++*px); //11 先*px=*px+1=10+1=11; 再执行printf
printf("%d\n", *px); //11
px = x;
printf("%d,", (*px)++); //11,执行printf,再*px=*px+1=11+1=12
printf("%d\n", *px); //12
px = x+1;
printf("%d,", *px++); //20,执行printf,再px=px+1指向了30
printf("%d\n", *px); //30
px = x+1;
printf("%d,", *++px); //30,先px=px+1 指向了30, 再printf
printf("%d\n", *px); //30
回文数的判断:
int main(int argc, char const *argv[])
{
char a[10];
gets(a);
int flag;//标志位设立
char *q=a,*p=a+strlen(a)-1;//头和尾
for(int i=0;i<strlen(a);i++)//遍历
// while(a)//a!='\0'
{
if(*q==*p)
{
q++;
p--;
flag=1;
}
else{
flag=0;
}
}
if(flag!=1)
{
printf("n\n");
}
else{
printf("y\n");
}
}
指针大小的计算:(sizeof)
64位:8
32位:4
将字符串转换为整形数字输出:
int main(int argc, char const *argv[])
{
char a[20];
gets(a);
char *p=a;
int sum=0;//定义存放变量存放转换后的值
// for(int i=0;i<strlen(a);i++)
while(*p!='\0')
{
if(*p>='0'&&*p<='9')
{
sum=sum*10+(*(p++)-'0');
// p++;
//printf("%d\n",sum);
}
}
printf("sum=%d\n",sum);
}
指针修饰:
<1>修饰普通变量
局部变量:
int main()
{
const int a=5;
char *p=&a;
*p=20;//通过指针修改a的值
}
全局变量:
注释:当修饰全局变量时,修饰的值不会发生改变,不能修改,否则报段错误