c语言第三课(数组与指针)

文章详细阐述了C语言中数组作为参数传递时的情况,指针的概念,包括数组首地址、常量指针和指针常量的差异。还介绍了斐波那契数列的计算方法。此外,讲解了如何计算字符串长度、比较和复制字符串,以及常用的相关库函数。最后,通过示例展示了指针和数组在内存操作中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组传到函数中传的是数组首元素的地址。

printf(“%x   %x   %x \n”,&a[0],&a,a)

三个数输出的值相同,%x表示以十六进制输出

&a[0]:传入的是数组首元素的地址,走一步跨越的是定义这个数组的数据类型大小(int型跨4个字节,char跨1个字节)

&a:传入的是数组的首地址,走一步跨越的是整个数组,从数组开头到数组结尾。

a:数组首元素的地址,走一步跨越的是定义这个数组的数据类型大小(int型跨4个字节,char跨1个字节)

(int*):强制类型转换

int *ptr1=(int*)(&a+1);  //跨过全数组地址后再被强制类型转换为指针

int *ptr2=(int *)((int)a+1);  //先将a强制定义为整型变量,再+1,之后再强制转换为指针。

输出:printf(“%x   %x”,ptr1[-1],*ptr2);

prt1[-1]:跨到数组末元素后,再往后退一个

*prt2:字节+1,按逻辑一个输出第一个整型剩下的3个字节,向第二个字节补足一个字节,但由于计算机不能这样输出,所以遇上类似题型可以这样表示,但不能这样输出。

int main()
{
   int a[4] = {2016,2017,2018,2019};
   int *ptr1=(int *)(&a+1);
   int *ptr2=(int *)((int)a+1);
   printf("%x,%x",ptr1[-1],*ptr2);
   return 0;
}

常量指针:指针指向的是一个常量,内存的值不能修改,但地址可以修改。

const int* ptr =&a

指针常量:指针本身是一个常量,指针本身不能修改,但内存可以更改。

int* const ptr=&a

斐波拉契数列

int main()

{

    int a[50]={0};    //判断50位以内的斐波拉契数列

    a[0]=1;

    a[1]=1;     //定义数组前两位为1

    int n;

    scanf("%d",&n);

    for(int i=2;i<50;i++){

        a[i]=a[i-1]+a[i-2];   //后一个数等于前两个数的合

    }

    printf("%d\n",a[n]);

    return 0;

}

如何计算字符串的长度,以及如何比较合复制数组。

当初始化定义字符串时,数组的最后一位计算机会自动生成一个终止符’\0’

所以我们要看字符是否是’\0’就能判断字符是否是字符串最后一位,但注意如果将数组储存满了,那么终止符’\0’也会被覆盖,虽然得益于编译器可以操作,但是十分危险,并且我们也不好对该字符串进行操作。

字符串的长度计算:

int charlen(char *s)

{int count=0;

    while(s[count]!='\0')

    {

        count++;

    }

    return count;

}

字符串的比较,要比较两个字符串是否一模一样,只要一个个字符比,比到最后一位,如果都一样的话,那么这两个字符串完全相同。

int compare(char *s1,char *s2)

{

    if(charlen(s1)!=charlen(s2))

    {

        return 0;

    }

while(*s1!='\0'&&*s2!='\0')

{

    if(*s1==*s2)

    {

        s1++;

        s2++;

    }

    else return 0;

}

return 1;

}

字符串的复制也是相同原理,从第一位开始复制,然后依靠循环,只要不到终止符就一直循环复制。

void StrCopy(char *dest,char *s)

{

   while(*s!='\0')

   {

    *dest=*s;

    dest++;

    s++;

   }

   *dest=*s;

}

计算机中也有现成的函数可以使用:

strlen():计算字符串的长度

strlen与sizeof有什么区别

strlen:函数,计算字符串的长度

sizeof:运算符,求所占内存的大小

得益于终止符的方便,我们可以对字符串进行一系列的操作,但同时,字符数组所占的内存实际上也会比字符串长度1,多的这个也就是这个终止符’\0。

ps:拷贝字符串最后一定要再拷贝一次‘\0’.

以下一个小测试题和答案:

char arr[] = { 'a','b','c','b' };
printf("%d\n", sizeof(arr));  //4
printf("%d\n", *(arr+0)); //a
printf("%d\n", sizeof(*arr));  //1
printf("%d\n", sizeof(arr[1]));   //1
printf("%d\n", sizeof(&arr));//8
printf("%d\n", sizeof(&arr+1));//8
printf("%d\n", sizeof(&arr[0]+1));//8

strlen()字符串的长度

strcmp (str1,str2)比较两个字符串,完全相同为1,不同为0

strncmp(str1,str2,n)比较两个字符串,但只比较前n位,完全相同为1,不同为0

strcpy(str1,str2)将str2复制给str1

strncpy(str1,str2,n)将str2的前n位复制给str1

strcat(str1,str2)将str2缝合在str1的后面

strncat(str1,str2,n)将str2的前n位缝合在str1的后面

strstr(str1,str2)函数搜索str2在str1中的第一次出现。 输出为str1的第一个单词。

函数指针:指向函数的指针,本质是一个指针

void (*ptr)()

指针函数:返回值是一个指针的函数,本质是一个函数

char* (ptr)()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值