1. 首先说一个指针作为函数参数传递的问题
要在主函数里面使用被调函数里改变的参数值,就要使用指针变量作为函数形参,这样在被调函数执行的过程中,让指针变量指向的变量的值发生变化,变化的变量值就被保存下来了
2. 数组名代表数组中第一个元素的地址
int *p=&a[0]
int *p=a; //这两句作用相同
3. 若指针变量p已经指向一个数组元素,则p+1就可以表示指向下一个元素
4. *p++相当于*(p++),*p++是先得到p指向的变量的值,再让p指向下一个元素
*++p是先让p加一,在取加一之后的值
5. 多维数组和指针
int a[2][3]={{1,3,5},{4,5,6}};
cout<<*(a[0]+2)<<endl; //输出5
二维数组a可以看作三个一维数组组成的,a[0]表示第一行的首地址
此时定义int *p=a, 是错的,因为p是指向整型数据的,但是a是指向二维数组的首行,即a[0]
此时定义int (*p) [3]=a ,是正确的,可以指向a的第一行元素(括号不能省略),此时p+1表示指向下一个一维数组
例子:
#include<iostream>
#include<string>
using namespace std;
int main()
{
int a[2][3]={{1,3,5},{4,8,6}};
cout<<*(a[0]+2)<<endl; //输出的是第一行的第三个元素5
cout<<a[1]<<endl; //输出第二行的地址
int *p1=a[0]; //指向a[0]一维数组的第一个元素
int (*p2)[3]=a; //p2指向一个一维数组,指向a的第一行,a是数组名,代表首行的地址,而首行就是一个一维数组
cout<<*(p1+1)<<endl; //输出的是3
cout<<*(p2+1)<<endl; //p2是指向一个一维数组的,所以加1就表示指向下一个数组,所以输出第二行的地址,相当于a[1]
cout<<*(*(p2+1)+1)<<endl; //指向第二行的第二个元素,即8
}
6. 字符串和指针
char s[]="Hello";
char *p_s=s; //指向字符串的首个字符
cout<<*p_s<<endl; //输出的是s的第一个字符
cout<<p_s;// 输出的是整个字符串,和整型数组的有点不一样
7.指针数组
int main()
{
void sort(char* name[],int n);
void print(char* name[],int n);
char *name[]={"abc","Name","Wt"};
int n=3;
sort(name,n);
print(name,n);
}
void sort(char* name[],int n)
{
char *temp;
int i,j,k;
for(i=0;i<n-1;i++)
{
k=i;
for(int j=i+1;j<n;j++)
{
if(strcmp(name[k],name[j])>0)
k=j;
}
if(k!=i)
{
temp=name[k];name[k]=name[i];name[i]=temp;
}
}
}
void print(char* name[],int n)
{
for(int i=0;i<n;i++)
{
cout<<name[i];
}
}