指向具有M个元素的一维数组指针
定义格式如下:
类型 (*指针变量)[M]; //M为一整型常量
通常利用该指针变量,指向二维数组的行地址,其中M表示二维数组的列数。
例如:利用行指针变量,按行输出二维数组各元素值
方法1:
int a[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};
int (*p)[4];
for(p=a; p<a+3; p++) // p++ 行++
{
//输出p所指行的各列元素值
for(int j=0; j<4; j++)
{
cout << *(*p+j) << "\t"; // *p+j表示的是地址
}
cout << endl;
}
其中,p是一个行指针,初值为0行的行地址,
p++
后p指向下一行,*p
表示该行0列元素的地址,*p+j
表示该行j列元素的地址
方法2:
int a[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};
int (*p)[4];
for(p=a; p<a+3; p++) // p++ 行++
{
//输出p所指行的各列元素值
for(int *q = *p; q<*p+4; q++) // *p表示的是0列元素的地址
{
cout << *q << "\t";
}
cout << endl;
}
其中p是一个行指针,初值为0行的行地址,
p++
后,p指向下一行,*p
表示该行0列元素的地址,q是指向列元素类型的指针,初值为*p
,即为该行0列元素的地址
字符串指针
字符串指针是字符串的首地址,即第一个元素(索引为0)的地址,使用char型指针变量存放其首地址。
例如:
char *str;
str = "hello";
//或者
char *str = "hello";
字符串常量可看成放在一个一维的字符串数组中,当指针指向字符串后,引用字符串中的字符可使用下面的形式
*(指针变量+下标)
或者指针变量[下标]
字符串指针应用
编写在字符串中查找某字符的函数
函数原型:
char *strchr(char *str, char c)
算法: 从str的第一个字符查起,查到字符后就返回该字符的地
址;查不到则返回空值NULL
char *strchr(char *str, char c)
{
while (*str != '\0')
{
if(*str==c)
{
return str; // 指针
}
else
str++;
}
return NULL;
}
int main()
{
char *str = "abcdefghij";
char *p;
p = strchr(str, 'j');
cout<<"该字符在串中的位置是:"<< p-str <<endl; // 获得index
return 0;
}
字符型指针与字符数组在使用中异同
char str[81] = "abcde", *pstr="abcde";
// 正确char str[81], *ptr; str = "abcde"; // 错误 ptr = "abcde"; 正确
char str[81], *ptr; cin >> str; // 正确 cin >> pstr; //错误
指针数组
定义格式:
类型 *数组名[元素个数];
例如,定义5个int型的指针数组
int *ptr[5];
例如,定义指向多个字符串的指针数组
char *str[] = {"Basic", "Fortran", "C++", "Java"};
指针数组应用
将月份数值转化为英文名称,(1-12)转化为对应的英文名称
char *month_name(int n)
{
static *month[] =
{
"Illegal month",
"January",
"Feberuary",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
}; // 静态数组,函数执行完空间不释放
return (n>=1 && n<=12)? month[n] : month[0]; // 返回字符串的指针, 技巧,是index0时候做了范围判定工作
}
int main()
{
int n;
cin >> n;
cout << n << "-" << month_name(n) << endl;
return 0;
}