指针和字符串

#include <stdio.h>
int main(void)
{
	char ch[] = "hello world";//栈区字符串
	char* p = ch;   //数据区常量字符串(不允许修改里面的内容)
	printf("%s\n", p);//打印出字串hello world(%s会从p对应的地址开始,对地址进行遍历,直至遇见/0结束)
	printf("%c\n",*p);//打印出字符h

	//char[2] = 'd';//不会报错

	//p[2] = 'd';  //会报错     这两条语句会报错,上方有解释(数据区常量字符串)
	//*(p + 2) = 'm'; //会报错

	//以下两行代码也是打印出字符串hello world
	char* a = "hello world";
	printf("%s\n", a);

	return 0;
}

(1)下面介绍在指针数组中如何实现字符串排序及打印字符串的首字母

#include <stdio.h>
int main(void)
{
	//指针数组
	//char ch1[] = "hello";
	//char ch2[] = "world";
	//char ch3[] = "abcdefg";
	//char* arr[] = { ch1,ch2,ch3 }; //这里面的字符串是可以修改的

	char* arr[] = { "hello","world","abcdefg" };//这里面的字符串是不可以修改的
	                   //这是一个字符串数组,存放的是"hello"等字符串的地址

	for (int i = 0; i < 3; i++)
	{
		//printf("%s\n", arr[i]);   //打印三个字符串
		printf("%c\n", arr[i][0]);//打印三个字符串中的首字母
	}

	//字符串排序
	for (int i = 0; i < 3 - 1; i++)   //外层控制行
	{
		for (int j = 0; j < 3 - 1 - i; j++)   //内层控制列
		{
			if (arr[j][0] > arr[j + 1][0])//找首字符进行比较,交换指针数组元素进行排序
			{
				char* temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
	printf("\n\n");
	for (int i = 0; i < 3; i++)  //打印排好序的字符串,将依次打印出"abcdefg","hello","world"
	{                                    //是根据首字母排序的
		printf("%s\n", arr[i]);
	}
	return 0;
}

(2)字符串指针作为函数参数

#include <stdio.h>
/*
int my_strlen1(char* ch)
{
	char* temp = ch;
	while (*temp != '\0')//也可以写成while (*temp)
		temp++;
	return temp - ch;
}
*/
 
int my_strlen2(char* ch)
{
	int i = 0;
	while (ch[i] != '\0')//也可以写成while (ch[i])
	{
		i++;
	}
	return i;
}

int main(void)
{
	char ch[] = "hello world";
	//int len = my_strlen1(ch);
	int len = my_strlen2(ch);

	printf("%d\n", len);
	return 0;
}

我注释掉的代码的作用和没注释掉的代码的作用是相同的,只是两种不同的实现方法而已。

(3)主函数参数(argc和argv[ ]的用法)

#include <stdio.h>

 //gcc -o hello hello.c(4个参数:"gcc","-o","hello","hello.c")
 //int argc 表示传递参数的个数
//char* argv[ ] = { "gcc","-o","hello","hello.c" }(表示参数具体的内容)
int main(int argc,char* argv[])//argc表示参数的个数
{
/*
	if (argc < 3)
	{
		printf("缺少参数\n");
		return -1;
	}
*/
	for (int i = 0; i < argc;i++)
	{
		printf("%s\n", argv[i]);
	}

	return 0;
}

上图是对a.c文件进行编译。第一个“a.exe”的后缀是由“a.c”直接改成的。如果上方代码中对i的定义(int i)写在了for循环的外面,那么上图的末尾就不需要加“-std=c99”了。上图编译完成后,会生成一个“a.exe”文件。然后把"a.exe"文件拖进命令行(把”a.exe“文件的路径加进去),接着空一格输入下一个字符串(输入的字符串的个数不少于两个,因为gcc -o 后面至少还要跟一个文件名,即算上gcc 和-o至少要有三个)。

argv[ ]捕获了5个字符串,我用红色方框已标出。值得注意的是gcc命令本身也算一个字符串,即上图中的“C:\Users\赵宇阳\Desktop\VS\字符指针作为函数参数\a.exe“。如果字符串个数小于3,则会报错,具体原因我在上面已经解释过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值