指针

1

#include <stdio.h>
#include <string.h>
int main() {
	char* p1 = "12345", * p2 = p1; //允许!
	char* p3, p4[80];
	//strcpy(p3,p1); 此时p3为野指针!
	p3 = "12345"; //允许
	strcpy(p4, p1); //p4="12345";不允许!
	puts(p1); puts(p2); puts(p3); puts(p4);
	p4[2] = 'A';//p1[2]=p2[2]=p3[2]='A';不允许
} //

2

*的优先级大于++

3

char *p="此时指针可以被修改,即:
指向其他字符串,但字符串的内容不
允许修改(否则导致运行时错误)";
*(p+2)='2';错误!但p=a;正确!

4

指针不能直接输入,可以用函数拷贝

void str_copy(const char *f,char *t) {
for (unsigned i=0;i<=strlen(f);i++)//注意这里相当于strlen(f)+1,因为要把'\0'拷贝
t[i]=f[i];
}
void str_copy(const char *f,char *t) {
while (*f) *t++=*f++;
*t='\0';
}
void str_copy(const char *f,char *t)
{
while (*t++=*f++);
}
下面的程序用5种方法实现字符串拷贝,其中的部分有错误,请你进行改正。
#include <stdio.h>
#include <string.h>

#define BUF_SIZE 10

#define setString  for (i=0;i<BUF_SIZE;i++) string1[i]=i
#define showString printf("[%s]\n",string1)

void strCpy1(char* t,const char *f);
void strCpy2(char* t,const char *f);
void strCpy3(char* t,const char *f);

int main() {
    int i;
    char string[BUF_SIZE]="123456789";
    char string1[BUF_SIZE];

    setString;
    strcpy(string1,string);
    showString;

    setString;
    strncpy(string1,string,strlen(string));
    showString;

    setString;
    strCpy1(string1,string);
    showString;

    setString;
    strCpy2(string1,string);
    showString;

    setString;
    strCpy3(string1,string);
    showString;

    return 0;
}

void strCpy1(char* t,const char *f) {
    for (unsigned i=0;i<strlen(f);i++)
        t[i]=f[i];
}

void strCpy2(char* t,const char *f) {
    while (*f) *t++=*f++;
}

void strCpy3(char* t,const char *f) {
    while (*++t=*++f);
}
//输出5行的[123456789]

5

正序输出字符串(前递归)

void showString1(char *s) {
if (*s=='\0') return;
putchar(*s);
showString1(s+1);
}

反序输出字符串(尾递归)

void showString2(char *s) {
if (*s=='\0') return;
showString2(s+1);
putchar(*s);
}

6

数组指针

#include <stdio.h>
int main() {
char (*name)[7]; //(指向)数组(的)指针!
char s[3][7]=
{"12345\n","54321\n","abcde\n"};
name=s; //指向多维数组!
for (int i=0;i<3;i++)
printf("%s",name+i);
for (i=0;i<6;i++)
printf("%c",(*(name+2))[i]);
for (i=0;i<6;i++)
printf("%c",*(*(name+1)+i));
}

7

c语言qsort

8

//要求用递归实现两个字符串的比较。
#include <stdio.h>
int strCmp(char* s, char* t);
int main() {
    printf("%d\n", strCmp("abc", "abcd"));
    printf("%d\n", strCmp("abcde", "abcd"));
    printf("%d\n", strCmp("abdab", "abcab"));
    printf("%d\n", strCmp("abcab", "abdab"));
    printf("%d\n", strCmp("abc", "abc"));
    return 0;
}
//功    能:比较两个字符串s和t
//入口参数:s和t分别为指向两个字符串的首地址
//返 回 值:字符串相同返回0,字符串s<字符串t返回负数,否则返回正数
int strCmp(char* s, char* t) {
    if (*s == '\0' && *t == '\0')return 0;
    if (*s == *t)
    {
        return strCmp(s + 1, t + 1);
    }
    return *s - *t;
}

9

sizeof和strlen的区别
(https://blog.csdn.net/m0_62534424/article/details/121895300)
sizeof计算数据类型占空间的大小
strlen返回字符串的长度
sizeof会包含'\0',而strlen不会包含'\0'

#include <stdio.h> 
#include <string.h> 
int main(void) {
	char st[] = "a0\007a\00\0";
	printf("%d,%d\n", strlen(st), sizeof(st));
}
函数输出4,7 //strlen也不会包括中间的'\0'
posted @ 2024-11-25 21:24  某朝  阅读(20)  评论(0)    收藏  举报