指针:
指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为
int *ip; /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch; /* 一个字符型的指针 */
空指针:
在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯。
int *p =NULL;
指针的声明与初始化:
/* 方法1:使指针指向现有的内存 */
int x = 1;
int *p = &x; // 指针 p 被初始化,指向变量 x ,其中取地址符 & 用于产生操作数内存地址
/* 方法2:动态分配内存给指针 */
int *p;
p = (int *)malloc(sizeof(int) * 10); // malloc 函数用于动态分配内存
free(p); // free 函数用于释放一块已经分配的内存,常与 malloc 函数一起使用,要使用这两个函数需要头文件 stdlib.h
取值
需要使用 ‘*变量名’获取指针的内容
动态内存分配:
系统为了有效的管理内存,把内存划分为:栈区、堆区、静态区、常量区、代码区。
栈区:
- 非动态内存区。
- 栈区存放的数据: 局部变量(定义在函数内部的变量)
- 栈区的内存由系统自动管理的(分配内存, 回收内存)
不需要开发人员管理
堆区:
- 动态内存区
- 由开发人员手动管理(申请内存, 释放内存)
- 使用
void free(void *ptr);
函数释放分配的内存区,需引入:include<stdlib>
标签库
指针数组的使用
void strmcpy(char* t, int m, char* s)
{
/*指针数组的访问 对指针 t 所指向的内容操作时,
不能直接使用指针 t ,需另外定义一个指针变量 p,使其指向
指针t,否则会改变指针 t 原本的内容。(t的地址会发生变化)
*/
//1:直接使用
printf("T1 = %s",t);
while(*t!='\0'){
printf("%c",*t);
t++;
}
printf("T2 = %s",t);
//T1与T2 的打印结果不同,原因是因为t的地址发生变化
//2:间接使用 打印每一个字符
char *p = t;
while(*p!='\0'){
printf("T = %c\n",*p);
p++;
}
printf("T = %c",*p);
//3:间接使用 求长度
char *q = t;
int i=0;
while(*(q+i)!='\0'){
printf("%c",*(q+i));
i++;
}
/*还可以写成数组的形式*/
while(q[i]!='\0'){
printf("T1 =%c",q[i]);
printf("T2 =%c",*(q+i));
i++;
}
字符串的部分复制
函数strmcpy将输入字符串char *t中从第m个字符开始的全部字符复制到字符串char *s中。若m超过输入字符串的长度,则结果字符串应为空串。
/*方式一:*/
char *pt=(t+m),*qs;
qs=pt;
s=qs;
// printf("S0 = %c\n",*s);
// printf("qs = %c\n",*qs);
// printf("T = %c\n",*pt);
while(*pt!='\0'){
// printf("s = %c\n",*qs);
qs= (pt++);
qs++;
}
// puts(s);
// printf("%s\n", s);
qs='\0';
/*方式二:*/
int tlen = 0;//字符串t的长度
while(t[tlen]!='\0'){
tlen++;
}
// printf("tlen = %d\n",tlen);
int slen = 0;
if(tlen < m ){
s[slen]='\0';
}else { //复制
for(int i= m-1;t[i]!='\0';i++){
s[slen++]=t[i];
}
s[slen]='\0';
}