一:指针本质
指针在本质上也是一个变量
指针需要占用一定的内存空间,一般为4个字节
指针用于保存内存地址的值
定义;int *p=&i
int*p=NULL
对指针所指向的内存空间赋值
int i=5;
int *p=&i
*p=6
如何将数值存储到指定的内存中
int *p=(int *)0x12ff7c;
*p=0x1000;
也可
*(int *)0x12ff7c=0x1000;
二:传值调用和传址调用
三:数组
相同类型变量的有序集合
在一片连续的内存空间中存储元素
数组元素的个数显示或者隐示指定
例如:int a[5]={1,2};
int a[]={1,2};
四:以指针的形式和以数组的形式访问
指针和数组都支持这两种方式访问
例如:char *p="shalimin";
char q[]="shalimin";
1;*(p+4):先取出p里存储的地址值,再加上4个字符的偏移量,得到新地址,然后取出新地址的值
p[4]:编译器总是把下标的形式操作解释为指针,解释如上
2:*(q+4):q表示数组首元素的首地址,解释如上
q[4]:以下标的形式操作解析为指针
五:数组a与&a
例如
a[5]
a:数组首元素的地址
&a:数组的地址
&a[0]=a:数组首元素的地址
六:数组参数
数组作为函数参数时,编译器将其编译成对应的指针
void f(int a[]) <<-->>void f(int *a)
void f(int a[5]) <<-->>void f(int *a)
七:C 语音中的字符串
c语言中的字符串是'\0'结束的字符数组
strlen:字符串的长度,遇到‘\0’,停止计数
sizeof;变量所占内存空间的大小
字符串复制
char *strcpy(char *dst,const char *src)
char *strncpy(char *dst,const char *src,size len)
字符串连接
char *strcat(char *dst,const char *src)
char *strncat(char *dst,const char *src,size len)
字符串比较
char *strcmp(const char *s1,const char *s2)
char *strncmp(const char *s1,const char *s2,size len)
s1=s2:返回0
s1>s2:返回正数
s1<s2:返回负数
实现strlen:
size_t my_strlen(const char *s)
{
return (assert(s),(*s!='\0';1+my_strlen(s+1):0));
}
实现strcpychar* strcpy(char* dst, const char* src)
{
char* ret = dst;
assert(dst && src);
while( (*dst++ = *src++) != '\0' );
return ret;
}