1、首先什么是指针,很简单,就是代表着一个空间,这个空间指向某个地址,地址里面又存有我们参加的存储的值。
2、指针变量:定义一个变量指向指针所在的地址
3、指针变量的定义,取地址运算符和取值运算符
首先是指针变量的定义和赋值:
变量类型(用的是指针指向的地址所存储的值得数据类型) 指针变量名(记得必须加*号) = 一个地址(一般用取址运算符&)
在定义和初始化之后,比如 char *pa =&a;之后,*pa的类型必须是a变量里面存储的数据类型;
#include <stdio.h>
#include <stdlib.h>
int main()
{
char a='f';
int b=109;
char *pa=&a;//定义一个指针,用*作为标示,并进行指针初始化,把指针指向一个地址
int *pb=&b;
*pa='n';//*pa表示指针指向的地址的值,pa表示的是指向的地址的地址
*pb+=123;
printf("%c\n",*pa);//这里的*是取值运算符
printf("%d\n",*pb);
printf("%d\n",sizeof(pa));//pa用sizeof指的是指针表变量的地址,也就是指针变量
printf("%d\n",sizeof(pb));
return 0;
}
可以通过指针来修改值或者scanf值
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a;
int *p=&a;
scanf("%d",&a);
printf("%d\n",a);
scanf("%d",p);
printf("%d\n",a);
return 0;
}
4、避免访问未初始化的指针:
比如下面这个:未定义指针指向的地址,电脑会随机分配地址,由此带来一系列的问题。系统一般会阻止你这样做,会给你报错。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *a;
*a=4;
return 0;
}
5、指针和数组:
指针指向的是一个地址,所以有scanf("%d",p);这样的情况出现,御用&运算符就可以。
而我们在往数组里赋值的时候,scanf("%s",str);也是没有用&取址运算符的,只是因为数组名就代表了数组第一个元素的地址。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char str[250];
printf("请输入字符串:");
scanf("%s",str);//注意,没有用到取址运算符&(只有字符串数组和指针scanf才不会用到&,因为他们的名字已经代表地址
printf("%s\n",str);
printf("%p\n",str);//用%p打印地址可得,数组名就是数组第一个元素的地址
printf("%p\n",&str[0]);
return 0;
}
6、指针指向数组:因为数组名就代表了数组第一个元素的地址,所以把指针指向数组有两种方法
char *p=str;//指针p指向了数组第一个元素地址
p=&str[0];//当然,这样也可以
我们还可以通过指针访问数组的元素:pa+1不是简单的地址加1,而是指向数组的下一个元素。定义指针为什么类型,就加对应类型的字节数。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char str[250];
char *pa=str;
// pa=&str[0];或者用这种方法
printf("请输入字符串:");
scanf("%s",str);//注意,没有用到取址运算符&(只有字符串数组和指针scanf才不会用到&,因为他们的名字已经代表地址
printf("%c\n",*pa);//注意这里打印*pa的话只打印的是一个字符
printf("访问数组里面的值还有别的方法,通过指针访问");
printf("第一个:%c 第二个:%c 第三个:%c",*pa,*(pa+1),*(pa+2));
return 0;
}
那同理,既然数组名就类似一个指针,那我们可以直接用数组名作为指针访问元素,这种方法称为指针法。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char str[250];
char *pa=str;
// pa=&str[0];或者用这种方法
printf("请输入字符串:");
scanf("%s",str);//注意,没有用到取址运算符&(只有字符串数组和指针scanf才不会用到&,因为他们的名字已经代表地址
printf("%c\n",*pa);//注意这里打印*pa的话只打印的是一个字符
printf("访问数组里面的值还有别的方法,通过指针访问");
printf("第一个:%c 第二个:%c 第三个:%c",*str,*(str+1),*(str+2));//运用了指针法
return 0;
}
7、既然数组名是一个指向数组第一个元素的指针,那我们可以直接定义指针存进一个一个字符串
那就和数组一样了
也就是说,指针定义字符串的话也可以用下标法
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *pa="mengxiangjia";//既然数组名是一个指向数组第一个元素的指针,那我们可以直接定义指针存进一个一个字符串
//那就和数组是一样的了
int i,length;
length=strlen(pa);
for(i=0;i<length;i++)
{
printf("%c\n",pa[i]);//也就是说,指针定义字符串的话也可以用下标发
}
return 0;
}