1、
char *const str;//指向不能改变
const char *str;//内容不能改变
2、
int arr[]={1,2,3,4};
arr++;//arr=arr+1;错误,arr不能表示左值;
3、重点:
关于int a[10]={1,2,3};问下面哪些不可以表示a[1]的地址?A
A、a+sizeof(int);//代表a+4===>a[4]
B、&a[0]+1;//a[0]=>*(a+0),&a[0]+1=>a+1===>a[1]
C、(int )&a+1;//若为(int)(&a+1)则代表加了整个数组,()的优先级
D、(int )((char)&a+sizeof(int));//(char*)&a+4,取决于字符型,一个字符为1个字节,加了4个字节,再强制转换为整型
4、
char *arr=“hello”
char *arr2=“hello”=======>返回值相同,“hello”(代表两个指针同时指向rodata段的同一字符串)
5、
#include<stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,6};
printf("%d\n",arr);
printf("%d\n",arr+4);//加16个字节(4位)
printf("%d\n",&arr[0]+1);//加4个字节
}
6、大小端问题:
大端:低地址存放高数据
小端:低地址存放地数据
0x12 34 56 78
权重大====>权重小
7、
#include<stdio.h>
bool ISBig()
{
int a=0x12345678;
char *p=(char*)&a;//强转
if(*p==0x78)
{
return false;//小端
}
else
{
return true;//大端
}
}
8、打印字符串长度(不包括\0):
#include<stdio.h>
#include<string.h>
int My_strlen(char *str)
{
int len=0;
while(*str++!='\0')
{
len++;
}
return len;
}
int main()
{
char *str="hello";
printf("%d\n",My_strlen(str));
}
9、字符串拷贝:
#include<stdio.h>
#include<assert.h>
#include<string.h>
/*法一:
void My_strcpy(char *dest,const char *scr)
{
int i;`
for(i=0;scr[i]!='\0';i++)
{
dest[i]=scr[i];
}
dest[i]='\0';//手动赋值
}
*/
/*法二:
void My_strcpy(char *dest,const char *scr)
{
while(*scr!='\0')
{
assert(dest!=0&&scr!=0);
*dest=*scr;
dest++;
scr++;
}
*dest='\0';
}
*/
/*法三(经典):
char *My_strcpy(char *dest,const char *scr)
{
char *p=dest;
assert(dest!=0&&scr!=0);
while(*dest++=*scr++){}
//return dest;//走到最后\0,当前只有\0,不知道打印什么
return p;
}
int main()
{
char *scr="hello";
char dest[6]={};
char *p=My_strcpy(dest,scr);//字符串拷贝函数
printf("%s\n",p);
return 0;
}
*/