指针就是变量的地址,变量的地址就是内存地址,在内存地址上存储内容。就可以通过指针访问变量的内容。
指针是一种数据类型,就是变量在内存中对应单元的地址。
如:
scanf("%d",&a); //&a就是变量a的地址。
1.指针简单例子:
指针的定义 和使用: 前面有*号.
int * 变量名 // 这个变量名就是指针 //地址
// *变量名:就是地址上的内容的值
int *p1; //这个指针是int型, 就可以访问int型的变量,
int a=10;
p1=&a; //指针是地址,把变量a的地址给p1.
就可以通过:*p1就是a的值 .访问变量a的值。
#include
int main(){
int a=10,b=12;
int *p1, *p2;
//scanf("%d",&a); //&a就是变量a的地址,
p1=&a; //把a的地址赋值给指针p1
p2=&b;
printf("%d %d\n",a,b);
printf("利用指针输出a,b为:%d %d",*p1,*p2); //*p1等价于a,*p2等价于*p2
return 0;
}
在数组中:指针指向数组的首地址。
int a[6]={1,2,3,4,5,6};
int *p1;
p1=&a[0]; //指针指向数组的第一个地址 //这里可以直接:
p1=a //数组名就是这个数组的首地址。
如何让指针访问到数组的其他元素呢?
就要用到指针的运算符,++; //就是指针的移动
p1++; //改变了地址,使地址指向了数组第二个元素(地址移动到数组的第二个位置)
#include
int main(){
int a[6]={1,2,3,4,5,6};
int *p1;
p1=&a[0]; //指针指向数组的第一个地址
printf("指针指向数组的第一个地址上的内容是:%d\n",*p1);
p1++; //指针运算符++,地址变化,每加一,地址就会指向数组下一个元素
printf("指针指向数组的第二个地址上的内容是%d\n",*p1);
p1++;
printf("指针指向数组的第三个地址上的内容是%d\n",*p1);
return 0;
}
结果:
3.利用指针依次顺序输出数组的值:
#include
int main(){
int a[6]={1,2,3,4,5,6};
int *p1;
p1=a; //指针指向数组的第一个地址
/* printf("指针指向数组的第一个地址上的内容是:%d\n",*p1);
p1++; //指针运算符++,地址变化,每加一,地址就会指向数组下一个元素
printf("指针指向数组的第二个地址上的内容是%d\n",*p1);
p1++;
printf("指针指向数组的第三个地址上的内容是%d\n",*p1);
*/
for(int i=0;i<6;i++){
printf("%d",*p1);
p1++;
}
return 0;
}
效果:
char *p1=“hello”; //指针指向:字符数组
在通过:p1输出内容 //p1
这里注意:
printf("%s\n",p1); //这个p1是输出整个字符串 :输出: “hello”
printf("%c",*p1); //这个是首个字符。输出“h”.
char *p2;
char we[20]=“hello world you!”;
p2=we;
#include
int main(){
char *p1="hello"; //指针指向:字符数组 . //区别一下写法
char *p2;
char we[20]="hello world you!";
p2=we;
printf("%s\n",p1); //区别整型 ,整型就是 *p1 ,字符串直接写p1;
//printf("%s\n",*p1); 这个是错误的
printf("%s",p2);
return 0;
}
一个结构体指针变量就是结构体变量的首地址
通过:结构体指针变量可以访问:结构体的成员。
通过结构体指针指向结构体变量来访问:结构体成员
p1=&stu; //把结构体变量的地址赋值给指针p1;
语法:
&(*p1).结构体成员// 来输入值赋值给结构体成员
scanf("%d",&(*p1).num);
p1->结构体成员 (输出结构体成员值)
printf("%d",p1->num);
#include
int main(){
struct Student{
int num;
char name;
}stu,*p1;
p1=&stu;
// scanf("%d",&stu.num);// 可以写成
scanf("%d",&(*p1).num);
printf("%d",p1->num);
return 0;
}