指针+一维数组/二维数组

1.快速排序注意事项:快速排序的二三步不能反过来。

一,指针操作一维字符型数组:
const char *s=“字符串” -- -- -- 获取字符串常量区的地址
const用了之后,就变为只读性,不能修改地址中的变量,eg:puts(char *s)

3.字符串拼接可能发生越界的情况,解决办法就是给够足够的拼接空间,避免导致空间重叠的情况
char *strncpy(char *dest,const char *src,size_t n );
----- n < strlen(src) 就是只拷贝前n个字符,最终dest中不会有‘\0’
----- n== strlen(src)  正常拷贝
----- n>strlen(src)   拷贝够次数后,剩余拷贝全部补‘\0’

char *strncat (char *dest,char *src,size_t n);
拼接的基础上多n个控制条件
----- n ----- n>=strlen(src) src拼完就结束 src=='\0'

int Strncmp(const char *s1, const char *s2, size_t n)


二,指针操作一维字符型数组(字符串)

注意:能加const就加const

gets   puts

void Gets(char *s)                       //输入字符串
{
	do
	{
		*s = getchar();
	}while(*s++!='\n');
	s--;
	*s='\0';
}
 
void Puts(const char *p)                //输出字符串
{
	while(*p!='\0')
	{
		putchar(*p);
		++p;
	}
	putchar('\n');
}

strlen



size_t Stlen(const char *s)          //stlen作用的模拟
{
	int cut = 0;
	while(*s!='\0')
	{
		cut++;
		s++;
	}
	return cut;
}


strpy/strncpy

char *Strcpy(char *dest,const char *src)             //赋值
{
	char *ret = dest;
	while(*dest = *src)
	{
		dest++;
		src++;
	}
	return ret;
}
char *Strncpy(char *dest, char *src,size_t n)
{
	char *ret = dest;

	while( n && (*dest = *scr) )
	{
		++dest;
		src++;
		--n;

	}
	while(n)
	{
		*dest = 0;
		++dest;
		--n;
	}
	return ret;
}

strcat/strncat

char *Strcat(char *dest,const char *src)        //字符串的拼接
{
	char *ret = dest ;
	while(*dest != '\0' )
	{
		dest++;
	}
	while((*dest = *src) != '\0')
	{
		dest++;
		src++;
	}
	return ret;
}
char *Strncat(char *dest,const char *src,int n)
{
	char *ret = dest;
	while(*dest != '\0')
		dest++;
	while(n && *src != '\0')
	{
		*dest = *src;
		dest++;
		src++;
		--n;
	}
	*dest = '\0';
	return ret;
}

strcmp/strncmp

char Strcmp(const char *s1,const char *s2)           //比大小
{
	while(*s1==*s2 && *s1=='\0' && *s2!='\0')
	{
		++s1;
		++s2;
	}
	return *s1 - *s2;
}
int  Strncmp(const char *s1,const char *s2,size_t n)
{
	n--;
	while( n &&*s1==*s2 && *s1=='\0' && *s2!='\0')
	{
		++s1;
		++s2;
		--n;
	}
	return *s1-*s2;
}

三,指针+函数

1.形式:

eg; int add(int a.int b)  {  }
      add 就是这块空间的地址--首地址,也就是函数名--入口地址

用法:int (*p) (int a,int b)


回调函数:

概念:回调函数是通过函数指针调用的函数,叫回调函数
技术上:通过函数指针实现
函数指针(指向基类型-为函数类型) 函数类型的指针

接口:void qsort(void *base, size_t nmemb, size_t size,int (*compar)(const void *, const void *));

void *:万能指针,可以接受任何类型的指针
@nmemb:     排序的元素个数
@size:           单个元素的大小
@compar:      比较函数

回调函数:int compar(const void *a, const void *b)
----compar 两个参数 其实表示 数组中某两个元素的地址
----compar 返回值 表示的就是数组中两个元素的大小关系


总结:1.函数名就是函数的入口地址
           2.定义一个函数指针变量获得函数名
           3.通过指针调用的方式,进行函数的调用
           4.用途:回调函数


四,指针+二维数组

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}

形式:int (*p)[4] = a

*(*(p+i)+j) === a[ i ] [ j ]

p+1 //偏移到了 下一个 int[4]
    //类型为int(*)[4]
*(p+1) //偏移到下一个int 
       //*(p+1) 代表的类型int[4] 此时相当于是 int[4]的数组名 
       //*(*(p+1) + 1)

你可能感兴趣的:(数据结构,算法,arm,java,开发语言,排序算法,arm开发)