指针 一般用法
(1)pointer_1=&a;指的是pointer_1与a指向的是同一个存储空间,这个空间呢就是存放变量a的空间
(2)定义指针类型是因为指针移动时的需要
(3)pointer_1=&a;pointer_1=&b;这表明指针pointer_1指向的存储空间改变了
(4)变量之间的赋值仅限于当条语句,在后面修改后不会同时改变
eg: a =b;
b = 5;
此时a不会等于5
指针用作函数参数(一级指针)
(1)函数中的参数通常有传值与传址一说
(2)交换函数比计较
swap(int *p1,int *p2)
{
int *temp;
temp=(int *)malloc(sizeof(int));
*temp=*p1;
*p1=*p2;
*p2=*temp;
free(temp);
}
上面这个函数在函数体中仅仅是改变了局部变量p1与p2的值
swap(int *p1,int *p2)
{
int *temp;
temp=p1;
p1=p2;
p2=temp;
}
上面这个函数在函数体中操作的才是p1p2指向的地址
一维指针域一维数组
(1)数组的指针与指针数组
数组的指针就是数组的起始地址,数组元素的指针是数组元素的地址。指针优点是使得目标程序占内存少、运行速度快,从而使得其质量更高。
(2)数组与指针变量用法
int a[8];
int *p;
p = a;
数组下标使用a[k];
数组名指针用*(a+k));
指针变量使用*p++;
一维指针二维指针与二维数组
int b[4][4];
int *pp=&b[0][0]; //指针
int **ppp=&pp; //指向指针的指针
for(*ppp;*ppp<(&b[0][0]+16);(*ppp)++)
printf("%d\t",**ppp);
for(pp=&b[0][0];pp<(&b[0][0]+16);pp++)
printf("%d\t",*pp);
字符串
1、用字符数组存放一个字符串
char str[ ]="this is str!!!";
在此 str 是一个数组名,代表字符串数组的首地址。
2、用字符指针指向一个字符串
char *str="this is str,too";
拷贝字符串的函数实现
void copy_string(char from[],char to[])
{
int i=0;
while(from[i]!='\0'){
(to[i]=from[i]);
i++;
}
to[i]='\0'; //注意这条语句
return ;
}
void copy_string(char from[],char to[])
{
int i=0;
while((to[i]=from[i++])!='\0'){
;
}
void copy_string(char *from,char *to)
{
int i=0;
while(*from!='\0')
*to++=*from++;
*to='\0';
return ;
}
指针数组与数组指针
指针数组指的是一个数组,数组中的每个元素都是指针类型,所有的指针都指向不同的
地址,所指的地址的数据也不一定一样,但是所指的数据类型必须一样。 int *ptr[4];
数组指针指的是定义的是一个指针,而指针指向的是数组,指针指向数组首单元的地
址,对于数组内部元素的属性不了解,仅仅是规定了数组首单元的地址,通过它可以找到整
个数组。 int (*ptr)[10];