学了好久的C语言,还是在入门的初级阶段,再回头看看指针部分,一点笔记分享。(第一次写文,顺便试试Markdown)
指针运算符
//为指针变量赋初值
int x=5,*p;
p=&x;
指针与函数
1.指针作为函数参数
//指针作为函数参数,进行数值交换
void change(int *p, int *q){
int temp;
temp = *p;
*p = *q;
*q = temp;
}
void main(){
int x = 3, y = 5;
change(&x, &y); //x,y地址作为实参传递给函数
printf("Chnaged:x=%d, y=%d",x,y);
}
2.指针作为返回值
//返回较大值
int* max(int *p, int *q){
if (*p>*p)
{
return p;
}else
{
return q;
}
}
void main(){
int *pointer, x, y;
x = 3;
y = 5;
pointer = max(&x, &y);
printf("%d\n", *pointer);
}
3.指向函数的指针
每个函数在编译时都会分配一个入口地址,该地址是该函数中第一条指令的地址,即函数的指针。
//计算两数之和应用
int sum(int x, int y){
int z;
z = x + y;
return z;
}
void main(){
int (*p)(int ,int ); //定义指向函数的指针变量
int a, b, c;
p = sum; //sum 函数的入口地址赋给指针变量p
scanf("%d %d", &a, &b);
c = (*p)( a,b); //用指向函数的指针变量调用函数
printf("a=%d,b=%d,sum=%d", a, b, c);
}
4.指向函数的指针作为函数参数
//求两数之和、差
//原本可以直接调用sum()、sub(),却将其地址作为参数传递给operate()。因为用指向函数的指针变量作为参数可以每次根据实际
//情况传递不同的函数入口地址给operate(),而无需修改该函数。利于程序的重用。
void operate(int x,int y,int (*funC)(int,int)){
int result;
result = (*funC)(x, y);
printf("%d\n", result);
}
int sum(int x, int y){
return x + y;
}
int sub(int x, int y){
return x - y;
}
void main(){
int x, y;
printf("please input x and y:");
scanf("%d,%d", &x, &y);
printf("sum=");
operate(x, y, sum); //sum函数的入口地址传给operate
printf("sub=");
operate(x, y, sub);
}
指针与数组
C语言规定数组名代表数组中的一个元素地址,即0号元素地址。(以下等价)
p=&a[0];
p=a;//a数组的首元素赋给指针变量p
1.指针运算
1.1指针加(减)一个整数
指针加上整数i仍是一个指针,该指针指向数组中的某个特定元素,元素位于p指向的元素后面的第i个位置的元素。
因为a代表数组的首地址,因此,a+i也代表a[i]地址。
如果每个数组元素占用多个内存单元,如int型占用两个内存单元,float型占用四个内存单元,那么每次执行p+1代表的地址实际上是p+i*l,l表示一个数组元素所占有的内存单元数(字节数)。假设a数组为int 型数组,如果p中存放地址是3000,那么p+1指向的是3002。
1.2.指针相减
只有当指针指向数组元素时,指针上进行的算术运算才能得到有意义的结果
只有两个指针都指向同一个数组,指针相减才有意义
两个地址不能相加
2.使用指针处理数组元素
- 1.下标法
使用下标引用数组元素
//计算整型数组所有元素和
for (i = 0; i < 10; i++)
{
scanf("%d", &a[i]);
sum += a[i];
}
- 2.指针法
使用数组名或使用数组元素的指针引用数组
for ( i = 0; i < 10; i++)
{
scanf("%d", a + i); //使用数组名引用数组元素 a+i等价于&a[i]
sum += *(a + i); //*(a + i)表示a[i]的值
}
//使用指针变量直接指向数组元素,不需要每次都重新计算数组元素的地址,相比前两种执行速度更快
for ( p=a; p<a+10; p++)//通过指针变量不断自增
{
scanf("%d", p);
sum += *p;
}
3.指针数组
一个数组的元素都是指针类型的数据
指针数组并不常用,更适合用来指向多个字符串。,进行字符串的处理。
4.指向指针数据的指针
int **p;//定义指向指针的指针变量
char *color[] = { "red", "yellow", "blue", "black", "green", "white" };//C语言中,字符串通过字符数组存储
char **p; //定义指向指针数据的指针变量
for (int i = 0; i < 5; i++)
{
p = color + i; //p是指向指针的指针变量,依次指向5个字符串
printf("%s\n", *p);
}