1.概念
什么是指针?
指针是一个变量,其值为另一个变量的地址,即内存位置的直接地址。保存变量地址的变量。
为什么要使用指针?
生成更高效紧凑的代码
plain
1.1 地址、变量与指针
地址:内存区中对每个字节的编号
指针:内存中的一个地址
指针变量:存放另一个变量的地址类型说明 * 变量名
*表示该变量为指针变量
变量名为指针变量名
类型说明为指向的变量类型
指针赋值:只能赋予地址,不能赋予其他数据& 变量名
plain
#include<stdio.h>
int main()
{
int a,b;
int *point1,*point2;
printf("请输入两个数:");
scanf("%d%d",&a,&b);
point1=&a;
point2=&b;
printf("两个数分别为:%d,%d",*point1,*point2);
}
引用指针变量:引用指针变量所指向的值
*指针变量
plain
#include<stdio.h>
int main()
{
int *p,q;
printf("请输入:");
scanf("%d",&q);
p = &q;
printf("数字为:%d",*p);
}
1.2 指针运算
& 取值运算符
- 指针运算符
&* 先指针后取值
*& 先取值后指针
指针自增自减按所指向类型的直接长度进行增减
plain
#include<stdio.h>
main()
{
int i;
int *p;
printf("请输入一个数字:");
scanf("%d",&i);
p = &i;
printf("结果1为:%d\n",p);
p++;
printf("结果2为:%d\n",p);
}
2.数组与指针
数组指针:存储数组的首地址
plain
#include<stdio.h>
main()
{
int *p,*q;
int a[5],b[5],i;
p=&a[0];
q=b;
printf("请输入第一个数组:\n");
for(i=0;i<5;i++)
{
printf("a[%d]=",i);
scanf("%d",&a[i]);
}
printf("请输入第二个数组:\n");
for(i=0;i<5;i++)
{
printf("b[%d]=",i);
scanf("%d",&b[i]);
}
printf("数组a为:\n");
for(i=0;i<5;i++)
{
printf("%5d",*(p+i));
}
printf("\n");
printf("数组b为:\n");
for(i=0;i<5;i++)
{
printf("%5d",*(q+i));
}
printf("\n");
return 0;
}二维数组:
*(a+i)与a[i]是等价的
字符串指针
plain
#include<stdio.h>
main()
{
char str1[] = "You are my god";
char str2[30];
char *p,*q;
p=str1;
q=str2;
while(*p!='\0')
{
*q=*p;
p++;
q++;
}
*q='\0';
printf("输出字符串为:\n");
puts(str2);
}字符串数组类型名 数组名[数组长度]
plain
#include<stdio.h>
main()
{
int i;
char *month[]=
{
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
};
for(i=0;i<12;i++)
{
printf("%s\n",month[i]);
}
}3.双重指针
类型标识符 **指针变量名
plain
#include<stdio.h>
main()
{
int i;
char **p;
char *month[]=
{
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
};
for(i=0;i<12;i++)
{
p=month+i;
printf("%s\n",*p);
}
}4.函数参数
plain
//交换地址
#include<stdio.h>
void Swap(int *a,int *b)
{
int temp ;
temp=*a;
*a=*b;
*b=temp;
}
int main()
{
int x,y;
int *c,*d;
scanf("%d%d",&x,&y);
c=&x;
d=&y;
Swap(c,d);
printf("%d,%d",x,y);
return 0;
}plain
//嵌套调用plain
//奇数之和plain
//冒泡排序plain
//字母顺序排序plain
//数组元素求和5.指针函数
类型名 *函数名(参数列表)*
plain
#include<stdio.h>
int per(int a,int b);
void main()
{
int ilong,width,result;
printf("请输入长和宽:");
scanf("%d%d",&ilong,&width);
result=per(ilong,width);
printf("周长为:%d",result);
}
int per(int a,int b)
{
return (a+b)*2;
}6.main参数
plain
#include<stdio.h>
main(int argc,char *argv[])
{
printf("命令名:%s\n",*argv);
printf("参数个数:%d\n",argc);
}