一、基本使用
定义格式
:变量类型 *变量名
先定义后赋值
指针变量只能存储地址。作用:能够根据一个地址值,访问对应的存储空间。
代码示例 :
int main(){
int *p; //定义一个指针变量
int a=80; //定义一个普通变量
p=&a; // 指针变量p指向变量a ,把a的地址传给指针p
*p=10; //改变了a的值 此时a=10
return 0;
}
*p=10; 赋值 *p取值
指针变量类型,指针变量只能指向同类型的数据。
例题:
#include<stido.h>
void change(int *n); //声明函数
int main()
{
int a= 90; //定义一个普通整型变量
change(&a); //调用函数并传递a的地址
printf("&d\n",a); //打印变量a的值
return 0;
}
void change(int *n) //创建带参函数,以指针 *n作为形参 ,主函数把a的地址传递过来,此时*n=90
{
*n=10; //为*n赋值10,改变了a的值,主函数打印出10
}
注意:
int *p=&a; //定义变量时的*仅仅是一个象征,没有其他特殊含义,可以理解为 (int *)p=&a;
错误写法 *p=&a;
正确:p=&a;
*p=20;
//*的作用,访问指向变量p指向的存储空间
练习:
在一个函数中实现计算两个变量的和跟差
#include<stdio.h>
int sumAndMinus(int n1,int n2,int *n); //函数声明
int main()
{
int a=1;
int b=2;
int sum; //存储和
int cha; //存储差
he=sumAndMinus(a,b,&cha); //为he赋值,调用函数传递a,b的值以及cha的地址
return 0;
}
int sumAndMinus(int n1,int n2,int *n)
{
*n=n1-n2; //因传递进来的为cha的地址,用指针改变cha的值
return n1+n2; //返回he
}
数组与指针
利用指针遍历数组
int ages[5]={1,2,3,4,5}; //定义一个数组
int *p; //定义一个指针
p=&ages[0]; //指针p指向数组首元素
for(i=0;i<5;i++){
printf("ages[%d]=%d\n",i,*(p+i));
}
p---->&ages[0]
p+1----->&ages[1]
p+2----->&ages[2]
p+i----->&ages[i]
数组元素访问方式:
1.数组名[下标] ages[i]
2.指针变量名[下标] p[i] -- 指针要指向数组名
3.*(p+i)
指针变量+1加多少,取决于指针的类型
int * 4
char * 1
double * 8
定义字符串的两种方式:
利用数组
char name[]="it";
利用指针
char *name2 ="it"; 指针变量name2指向了字符串的首字符
printf("%s\n",name2);
%s 打印字符串 ,从首地址开始直到遇到 '\0'
数组存放字符串与指针存放字符串的区别:
char name[] ="it";
name[0] = 'T';
此为字符串变量,可以任意修改数组内的字符。
使用场合:字符串的内容需要经常修改。
char *name2 ="it";
*name2 ='T';
错误,引起程序崩溃,为字符串常量,不可以修改其内的字符。
使用场合:字符串的内容不需要修改,而且这个字符串经常使用。
char *name2="it";
char *name3="it";
name2与name3指向同一个地址,"it"放在常量区,有了一个缓存,当下次再访问时,代表同一个常量不需要再开辟存储空间存储此常量。
定义字符串数组:
指针数组
char *name[5] ={"jack","rose","micl"};
二维字符数组
char name[2][10] ={"jack","rose"};
返回指针的函数
char *test()
{
return "rose";
}
指向函数的指针
void test()
{
printf("调用函数\n");
}
int main()
{
//(*p)是固定写法,代表指针变量p将来肯定是指向函数
//左边的void:指针变量p指向的函数没有返回值
//右边的():指针变量p指向的函数没有形参
void (*p)();
//指针变量p指向了test函数
p=test;
(*p)(); //利用指针变量间接调用函数,p();也可以
test(); //直接调用函数
return 0;
}