学习内容
2指针:
2.1指针变量:
指针变量*p,p存储的是一个内存中的地址。*p为该地址的值
*:取值操作符
&:取地址操作符
2.2 &和*运算符的自右向左运行(& * ++的优先级别一致,从右向左求值)
举例:&*point的意思是取*point的值,然后求它的地址。
*point++的意思是先地址+1,然后取值。(*point)++的意思是先取*point的值,然后加1.
2.3 数组和指针
举例:int a[10]; int*p; p=a,即指针指向数组p.也可以定义为p=&a[0];
指针引用一个元素为:*(p+i)
2.4 二维数组和指针
举例:
int(*p)[4];定义了一个二维数组.
*p:第0行第0列元素的地址(即对于二维数组,*p为地址。所以*p可以看成是一个一维数组的地址。其值可以是*(*p))
*(p+i)+j:第i行第j列元素的地址。
*(*(p+i)+j):第i行第j列元素的地址的值
2.5 字符串和指针
2.5.1 定义字符指针:char *p="hello world";等价于char str[]="hello world";(注:数组的结尾为\0)
2.5.2 char *a,char *b,如果要把*a的值复制到*b中,会报错,需要修改char *b为char b[];
2.5.3 char *a的值可以修改:char *a="1243555";a+=1;(即将指针从2开始输处)
2.5.4 char *a可以用下标的方式输出单个字符:char *a="1245",printf("%c",a[1])
2.5.5 函数指针的使用(变量指向函数):
int a=1,b=2,c;
int max(int,int);//定义一个函数
int (*p)();//定义一个函数指针
p=max;//将函数指针指向max函数
c=(*p)(a,b);//通过*p调用函数指针
重要:但是为什么要这么做呢?可以使用指向函数的指针作为某一个函数的参数传入,例如:
void sub(int (*x1)(int),int(*x2)(int,int))
{
int a,b,i,j;
a=(*x1)(i);
b(*x2)(i,j);
}
2.5.6 指针函数(函数返回值为指针)
例如:int *fun(int (*p)[4],int n);//int (*p)[4]定义了一个二维数组
2.5.7 指针数组(还要多研究)
数组中的每个元素都为指针类型的数据,例如int *name[4];里面有4个指针
int a[4]={1,2,3,4};
int *name[4]={&a[0],&[1],&[2],&a[3]};
printf("%d",*name[0]);//打印出a[0]的值
2.5.8 二级指针(还要多研究)
举例:int **p2;//指向指针的指针
int a=100;
int *p1=&a;
int **p2=&p1;
2.5.9 void指针
即不指定它是指向哪一种类型的指针变量。例如:void *p;
*表示指针变量p不指向一个确定的类型数据,它的作用仅仅是用来存放一个地址。
*void指针它可以指向任何类型数据。也就是说,可以用任何类型的指针直接给void指针赋值。
但是,如果要将void指针的值赋给其他类型的指针,则要进行类型转换。
*按照ANSI(American National Standards Institute)标准,不能对void指针进行算法操作,即下列操作都是不合法的:
void *pvoid; pvoid++;//不合法 pvoid+=1;//不合法
2.5.10 const 指针
(1) const char *str="ni hao";//声明一个名为str的指针变量,指向一个字符型常量(const其实修饰的是 nihao,即nihao不能被修改)
str[0]='w';//语法错误,常量不能被修改,但是可以可以改变str指针的值
str="ni hao 2";//合法!
(2) char * const str="ni hao";//常量指针是一个固定指针,不可以改变它的值,但是它指向的数据可以改变(const修饰指针,即
指针的地址不可以修改)
str[0]='w';//合法
str="ni hao 2";//错误
(3) const char * const str="ni hao";
str[0]='w';//错误
str="ni hao 2";//错误
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void swap(int *p, int length)
{
int *m;//中间元素
int *j;//结束元素
int *i;//开始元素
int temp;//临时元素
i = p;
m = p + (length - 1) / 2;
j = p + length - 1;
for (; i <= m; i++,j--)
{
temp = *i;
*i = *j;
*j = temp;
}
}
void copy_string(char *from ,char *to)
{
while ((*to=*from)!='\0')
{
to++;
from++;
}
}
void main()
{
int b[3],j,*p;//使用指针p打印结果,指针指向数组b
p = b;
printf("请输入三个元素:\n");
for (j = 0; j < 3; j++)
{
scanf("%d", &b[j]);
}
printf("\n");
printf("---------------------使用指针打印数组-------------------------------------\n");
for (j = 0; j < 3; j++,p++)
{
printf("数组的第[%d]个元素为%d:\n", j + 1, *p);
}
printf("---------------------使用指针交换顺序:交换前-------------------------------------\n");
int i,a[8] = { 1,5,7,8,4,10,11,6 };
for (i=0;i<8;i++)
{
printf("数组的第[%d]个元素为%d:\n",i+1,a[i]);
}
swap(a, 8);
printf("---------------------使用指针交换顺序:交换后-------------------------------------\n");
for (i = 0; i < 8; i++)
{
printf("交换后,数组的第[%d]个元素为%d:\n", i + 1, a[i]);
}
printf("---------------------打印二维数组-----------------------------------------------\n");
int(*point)[4];
int c[3][4] = { {1,2,3,5},{4,5,6,9},{7,8,9,11} }, m,n;
point = c;
for (m=0; m < 3; m++)
{
for (n=0; n < 4; n++)
{
printf("%5d",*(*(point+m)+n));
}
printf("\n");
}
printf("------------------------使用指针字符串拷贝-----------------------------------------------\n");
//拷贝字符串,将a的字符串拷贝到a
char *str_a = "ni hao a";
char str_b[] = "ni hao b";//不能使用*str_b定义字符串会报错,要使用char str_b[];因为*str_b为常量,不能被修改
copy_string(str_a,str_b);
printf("%s\n",str_b);
printf("--------------------------------函数指针使用-----------------------------------------------\n");
int add(int a, int b);
int del(int a, int b);
int mult(int a, int b);
void process(int a, int b, int(*p)());//定义一个函数指针*p
int fun_a = 5, fun_b = 2,(*fun_point)();
fun_point = add(fun_a,fun_b);
process(fun_a, fun_b, fun_point);
fun_point = del(fun_a, fun_b);
process(fun_a, fun_b, fun_point);
fun_point = mult(fun_a, fun_b);
process(fun_a, fun_b, fun_point);
printf("--------------------------------void指针使用-----------------------------------------------\n");
void *void_p;
int *int_p=3;
int *copy_from_voidp;
void_p = int_p;
printf("将int_p的值赋给void_p(*void_p=*int_p):%d\n", void_p);
copy_from_voidp = (int *) void_p ;//将void指针转换为float
printf("将void_p的值赋给copy_from_voidp(int_p=(int)void_p):%d\n", copy_from_voidp);
}
int add(int a, int b)
{
return a+b;
}
int del(int a, int b)
{
return a - b;
}
int mult(int a, int b)
{
return a * b;
}
void process(int a, int b,int(*p)())
{
int c;
c = p;//c接受函数返回结果
printf("这里调用了指针函数(*p)():%d\n", c);
}
int x = 10, y = 8;