一.指针运算符
int *p,a=1;
p=a;
&*p的含义是什么?
&与*的优先级是一样的,但是自右向左结合,先*p,就是a的值,再&a,即取a的地址
所以&*p与&a相同,都是取a的地址
*&a含义是什么?
先取地址再取变量a的值,即*&a与a等价
二.指针与数组结合赋值易错实例
#include<stdio.h>
void main()
{
int *p,i,a[10];
p=a;
for(i=0;i<10;i++)
{
scanf("%d",p++);
} //循环结束时p指针指到了a数组的最后一个地址
printf("\n");
for(i=0;i<10;i++,p++) //这里就要对p指针初始化for(p=p-10;i=0;i<10;i++,p++)
{
printf("%d",*p);
}
}
三.字符串中字符的存取
字符串a复制给字符串b
下标法
#include<stdio.h>
void main()
{
char a[]="i love you !",b[40];
int i;
for(i=0;*(a+i)!='\0';i++)
{
*(b+i)=*(a+i);
}
*(b+i)='\0';
}
指针法
#include<stdio.h>
void main()
{
char a[]="i love you !",b[40];
int *p1,*p2,i;
p1=a;
p2=b;
for(i=0;*(p+i)!='\0';p1++,p2++)
{
*p2=*p1;
}
*p2='\0';
}
四.指针常量是不可以被修改的
五大分区:堆、栈、自由存储区、全局/静态存储区和常量存储区
*b=”you are a man“ 是常量不可改变
正确复制代码如下
五.指针与二维数组
如何用指针表示二维数组第i行j列的元素?
*(*(p+i)+j)
int a[3][5]={{3,5,4,5,5},{8,9,23,,35,6},{5,9,5,4,5}}
p=a;
printf("%d",*(*(p+1)+2)); //表示输出数组a的第1行2列元素,即9;
六.字符指针与字符数组
赋值方式区别:
字符数组只能对各个元素赋值,不可以用一下方式赋值
char str[20];
str="hello word";
但是字符指针可以这样赋值
char *str;
str="hello word"; //赋给str的是字符的第一个元素的地址
赋初值的区别:
char *str;
str="hello word";
等价于 char *str=“hello word”;
而
char str[20];
str[]="hello word";
不等价于char str[20]={“hello word”};
指针不可以如下赋值
char *a;
scanf(“%s”,a);
如果定义了一个指针变量并是他指向一个字符串,就可以用下标的形式应用指针变量所指的字符串中的字符,如:
char *a=“hello word”;
就可以用a[6]表示w
七.指向函数的指针
如:
比较两个数的大小,打大的数赋值给c
int max(int x,int y) //功能比较x,y的大小
{
}
void main()
{
int max(int,int);
int (*p)();
int a,b,c;
p=max;
scanf("%d %d",&a,&b);
c=(*p)(a,b); //调用max函数后的值给c
}
八.返回指针值的函数
把查询的学生全部成绩输出
#include<stdio.h>
void main()
{
double score[]={ {60.0,70.0,80.5,90.5},{54.0,59.0,61.0,62.0},{75.5,76.0,85.0} };
double *search (double(*pointer)[4],int); //二维数组指针作为形参
double *p
int i,m;
pringtf("please enter the number of student:"); //查询第几位学生的成绩
scanf("%D,&m);
printf("the score of N0.%d are :",m);
p=search(score,m); //把数组名传递进给二维数组指针(*pointer)[4],search函数返回值 给p指针
for(i=0;i<4;I++)
{
printf("%5.2f\t",*(p+1)); // \t水平制表符,相当于 tab键,宽度一般为8个空格
}
printf("\n\n");
}
double *score(double (*pointer)[4],int n)
{
double *pt;
pt=*(pointer+n); //把二维数组中第n个学生的地址给pt指针
return pt;
}
九.指针数组
void main()
{
int a[5]={1,3,5,7,8}
int *name[5]={ &a[0], &a[1], &a[2], &a[3], &a[4]}; //五个元素都是指针,存放的都是地址
int i;
for(i=0;i<5;I++)
{
printf("%d",*name[i]);
}
}
十.指数组
将字符串按字母大小(由小到大)输出
#include<stdio.h>
#include<string.h> //因为要用到字符串函数所以要调用这个函数库
void main ()
{
void sort (char *name[],int); //函数功能比较字符串大小
void print(char *name[],int); //打印出改变好的字符串
char *name[]={" hello word","thank you","hansome"};
int n=3; //比较三个字符串的大小
sort(name,n);
print(name,n);
}
void sort(char *name[],int n)
{
char *p;
int i,j,k;
for(i=0;i<n-1;i++) //比较次数,第i个开始比较
{
k=i;
for(j=i+1;j<n;j++)
{
if(strcmp(name[k],name[j])>0) //第i个字符串与其后字符串比较,如果比后面的大则改变k值
{
k=j; //此时k记下比i字符串大的字符串下标
}
if(k!=i) //k值不等于i,表示第i个字符串比第j个大,则交换
{
p=name[i];
name[i]=name[j];
name[j]=p;
}
}
}
}
void print(char *name[],int n)
{
int i;
if(i=0;i<n;i==)
printf("%s",name[i]);
}
十一.指向指针的指针
形式:char **p
#include<stdio.h>
void main()
{
char *name[]={"hand","handsome","good"};
char **p;
int i;
for(i=0;i<n;i++)
{
p=name+i;
printf("%s\n",*p); //注意这里是*p
}
{
十二.const用法
const char *p="hello word"
此时不可以改变字符串内容,p[0]='m'是错误的,但是可以改变地址,p=“handsome”
char * const p[]="hello word" p[0]='m'是合法的,p=“handsome”非法
const char *const str[]="hello word", [0]='m'是非法的,p=“handsome”非法
十三.小结