形参改变影响实参主要应用在以下几个方面:
1.用于外部函数要交换主函数中的两个值,可以用指针来实现,但通过指针来实现主函数中两个数的交换必须要知道,哪些类型属于值传递,哪些类型属于地址传递,对于值传递的那些类型(例如:整形、字符型)才有必要用指针来实现,因为数组,字符串属于地址传递类型,所以没必要在外部函数通过用指针来实现主函数中的两个数的交换。举例:
2.在开辟空间的时候使用二级指针来实现主函数中指针内存的开辟,不然如果不用二级指针的话就必须在外部开辟空间的函数有一个返回值类型,然后赋值给主函数中的指针,如果不通过这两种方法实现的话就可能引发内存问题,举例:
方法 一、通过在外部开辟空间的函数里有返回指针类型,然后赋值给主函数中的指针的方法,来实现主函数中指针空间的开辟
方法二、通过二级指针来实现对主函数中指针的赋值,所谓二级指针就是指向指针的地址
数组存放的问题
int a[]={2,3,4};
int *p=a;
int *q=&a[0]; //跟第一种情况一样,都是指向数组第一个元素的首地址
int *k=&a; //将数组a当做整体,如果k++,那就指向末尾了
strcpy标准写法
//断言
char * func(cahr *pDest, const char *pBegin)
{
assert(pDest !=NULL && pBegin != NULL); //意思就是如果这两个有一个为空,就不向下执行,返回一个message或者提示什么的
char *pReturn = pDest;
while((*pDest++ == *pBegin != '\0'));
return pReturn;
}
#include <stdio.h>
void func(int a[4]) //这儿编译器不会把它当做数组,只是会当做指针而已
{
printf("形参的字节大小:%d\n",sizeof(a)); //形参数组,编译器只会把它当做指针
}
int main(int argc, const char * argv[])
{
int a[]={1,2,3,4};
func(a);
int *p=a;
int *k=&a[0];
int *q=&a;
int *j=&a+1;//把a数组当做整体加一,跟上面的q+1不一样q+1只是将数组的首地址+1
printf("P,k,q的地址:%d %d %d\n",p,k,q);
printf("数组a的内存大小是多少字节:%d\n",sizeof(a));
printf("++P:%d\n",++p);
printf("++k:%d\n",++k);
printf("&a+1:%d\n",&a+1);
printf("++q:%d\n",++q);
printf("&a+1,将数组作为一个整体+1:%d\n",j);
printf("j+1,将数组作为一个整体+1:%d\n",j);
printf("取出数组的最后一个数:%d\n",*(j-1));
//++的话要看它的偏移是以哪种类型偏移的,char*p,p++,就是以字符型字节长度为单位长度+1;int *p=&a+1;偏移是以整个数组的字节长度为单位长度加一
return 0;
}
运行结果:
形参的字节大小:8
P,k,q的地址:1606416448 1606416448 1606416448
数组a的内存大小是多少字节:16
++P:1606416452
++k:1606416452
&a+1:1606416464
++q:1606416452
&a+1,将数组作为一个整体+1:1606416464
j+1,将数组作为一个整体+1:1606416464
取出数组的最后一个数:4
int a[]={1,2,3};
int *p=a+1;
printf("%d",a);
printf("\n%d",p);
printf("\n%d",++p);
运行结果:看出来++p跟a+1是等价的,单位长度都是int型的单位长度
1606416332
1606416336
1606416340
获取当前时间(C语言)
#include <stdio.h>
#include <time.h>
#include <string.h>
int main(int argc, constchar * argv[])
{
time_t now;
structtm *timenow;
time(&now);
timenow = localtime(&now);
char *p = asctime(timenow);
printf("当前时间是:");
printf(p);
printf("%d",strlen(p));
}