由于自己的C语言实在看不下去,决定借用寒假时间,重习C语言重要部分。
指针在其中占有很大的作用,选择重习,不为以后拖后腿。
先学习指针的基础知识。
指针优势:
(1)提高程序的编译效率和执行速度。
(2)通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯。
(3)可以实现动态的存储分配。
(4)便于表示各种数据结构,编写高质量的程序。
指针与地址:
由于在计算机中,内存是以字节为单位的连续存储空间,每一个字节都有编号,编号即为地址。
内存的存储空间连续,so地址连续。一个变量的内存地址称为该变量的指针。
指针变量的定义:
类型说明有三:
(1)指针类型说明,即定义变量为一个指针变量;
(2)指针变量名;
(3)变量值(指针)所指向的变量的数据类型。
类型说明符 *标识符;
比如说:
int a,b,c;
int *p;
p=&a;
a=5;
b=10;
c=a+b;
指针变量赋值:
但其值是地址,无符号的整型。不能把其整型常量赋值给指针变量。
如"scanf("%d",&a);" 变量a的赋值,将数据存到a的地址中。即在a的指针中,"&"表示取地址,"&a"表示变量a的地址。
Tips:指针变量赋值时,注意类型的匹配。
int a;
float b;
int *x=&a; //正确
int *y=&b; //错误
实例:输入两个数,交换它们的值。
#include<stdio.h>
int main()
{
int a,b,c;
int *x,*y; //定义两个指针变量
x=&a,y=&b;
scanf("%d%d",&a,&b);
c=*x;
*x=*y;
*y=c;
printf("a=%d,b=%d\n",a,b);
return 0;
}
指针的运算:
(1)取地址运算符&:求变量的地址
(2)取内容运算符*:表示指针所指的变量
(3)赋值运算
·把变量地址赋予指针变量
·同类型指针变量相互赋值
·把数组,字符串的首地址赋予指针变量
·把函数入口地址赋予指针变量
(4)加减运算
对指向数组,字符串的指针变量可以进行加减运算,如p+n,p-n,p++,p--等。
对指向同一数组的两个指针变量可以相减。对指向其它类型的指针变量作加减运算是无意义的。
(5)关系运算
指向同一数组的两个指针变量之间可以进行大于、小于、 等于比较运算。指针可与0比较,p==0表示p为空指针。
指针可以加上或减去一个整数。指针的这种运算的意义和通常的数值的加减运算的意义是不一样的,以单元为单位。
int main()
{
int a=2,*p=&a,*q=&a;
printf("%d,%d",*p++,*(q++)); //输出a的值
printf("\n");
printf("%d.%d",*p++,*(q++)); //输出a的下一地址的值
printf("\n");
a=2;
p=&a;
q=&a;
printf("%d,%d",*p++,*(++q));
return 0;
}
输出结果为
2,2
6684228,6684228
2,6684228
当p\q的值发生变化,指向另一个不确定的变量时,结果不可预料。
指针在其中占有很大的作用,选择重习,不为以后拖后腿。
先学习指针的基础知识。
指针优势:
(1)提高程序的编译效率和执行速度。
(2)通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯。
(3)可以实现动态的存储分配。
(4)便于表示各种数据结构,编写高质量的程序。
指针与地址:
由于在计算机中,内存是以字节为单位的连续存储空间,每一个字节都有编号,编号即为地址。
内存的存储空间连续,so地址连续。一个变量的内存地址称为该变量的指针。
指针变量的定义:
类型说明有三:
(1)指针类型说明,即定义变量为一个指针变量;
(2)指针变量名;
(3)变量值(指针)所指向的变量的数据类型。
类型说明符 *标识符;
比如说:
int a,b,c;
int *p;
p=&a;
a=5;
b=10;
c=a+b;
指针变量赋值:
但其值是地址,无符号的整型。不能把其整型常量赋值给指针变量。
如"scanf("%d",&a);" 变量a的赋值,将数据存到a的地址中。即在a的指针中,"&"表示取地址,"&a"表示变量a的地址。
Tips:指针变量赋值时,注意类型的匹配。
int a;
float b;
int *x=&a; //正确
int *y=&b; //错误
实例:输入两个数,交换它们的值。
#include<stdio.h>
int main()
{
int a,b,c;
int *x,*y; //定义两个指针变量
x=&a,y=&b;
scanf("%d%d",&a,&b);
c=*x;
*x=*y;
*y=c;
printf("a=%d,b=%d\n",a,b);
return 0;
}
指针的运算:
(1)取地址运算符&:求变量的地址
(2)取内容运算符*:表示指针所指的变量
(3)赋值运算
·把变量地址赋予指针变量
·同类型指针变量相互赋值
·把数组,字符串的首地址赋予指针变量
·把函数入口地址赋予指针变量
(4)加减运算
对指向数组,字符串的指针变量可以进行加减运算,如p+n,p-n,p++,p--等。
对指向同一数组的两个指针变量可以相减。对指向其它类型的指针变量作加减运算是无意义的。
(5)关系运算
指向同一数组的两个指针变量之间可以进行大于、小于、 等于比较运算。指针可与0比较,p==0表示p为空指针。
指针可以加上或减去一个整数。指针的这种运算的意义和通常的数值的加减运算的意义是不一样的,以单元为单位。
&和*运算
#include<stdio.h>int main()
{
int a=2,*p=&a,*q=&a;
printf("%d,%d",*p++,*(q++)); //输出a的值
printf("\n");
printf("%d.%d",*p++,*(q++)); //输出a的下一地址的值
printf("\n");
a=2;
p=&a;
q=&a;
printf("%d,%d",*p++,*(++q));
return 0;
}
输出结果为
2,2
6684228,6684228
2,6684228
当p\q的值发生变化,指向另一个不确定的变量时,结果不可预料。