数组传到函数中传的是数组首元素的地址。
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)()