#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,则会报错,具体原因我在上面已经解释过。