计算机程序设计c++ 8-3:指向一维数组指针(行指针)及字符串指针

指向具有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;
}
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uncle_ll

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值