?本练习的主题:一个对象的指针可以修改这个对象的内容;
注:对象是指一个固定大小的内存块。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int getMem(char **p1,int *mylen1,char **p2,int *len2)
{
int ret = 0;
char *tmp1 = (char *)malloc(100);
strcpy(tmp1,"aabbccdd");
*mylen1 = strlen(tmp1);
*p1 = tmp1;
char *tmp2 = (char *)malloc(100);
strcpy(tmp2,"1122334455");
*len2 = strlen(tmp2);
*p2 = tmp2;
return ret;
}
int main(void)
{
char *p1 =NULL;
char *p2 =NULL;
int len1 = 0;
int len2 = 0;
getMem(&p1,&len1,&p2,&len2);
printf("str1:%s,len 1:%d\n",p1,len1);
printf("str2:%s,len 2:%d\n",p2,len2);
if (p1 != NULL)
{
free(p1);
p1 = NULL;
}
if (p2 != NULL)
{
free(p2);
p2 = NULL;
}
return 0;
}
指针的例子2:
int main(void)
{
char from[128];
//情况1:也可以写成 char to[128] = {0}; 数组的每个元素都定义为0了
//情况2:也可以写成 char to[128] = {'\0'}; 数组的每个元素都初始化为'\0'了
//情况2和情况1实际上是等价的,即效果相同。效果就是每个字符都初始化为空字符'\0'了。
char to[128];
strcpy(from,"112223345kjjnmasldf");
char *p1 = from;
char *p2 = to;
while (*p1 != '\0')
{
*p2++ = *p1++;
}
*p2 = '\0';
printf("%s",to);
return 0;
}
注:(1)'\0'按照字符打印(也就是"%c")格式输出时候什么也不输出,也就是空字符。
(2)'\0'按照整数打印(“也就是printf中使用%d格式打印”)格式输出是0,因为空字符的ASCII码是0,字符和整数的关系密切。千万要理解。
例如 char buf[100] = {'a','b','c','d'};那么其余没定义的字符,编译器全部定义为空字符了。
printf("%d",buf[80]);结果是1.
printf("%c",buf[80]);结果是什么也不显示,也就是空字符。
看一个字符数组的例子:
#include <stdio.h>
#include <string.h>
int main()
{
char buf[100] = {'a','b','c','d'};
char buf1[100] = "abcd";
printf("buf:%s",buf);
if (buf[4] == '\0')
printf("yes ,buf[4]是一个空字符.\n");
else
printf("No,buf[4]不是一个空字符.\n");
if (buf[4] == buf1[4])
{
printf("yes,buf[4] == buf1[4],都是一个空字符\n");
}
int ret = strcmp(buf,buf1);
printf(ret == 0?"对于strcmp,buf和buf1是相等的":"对于strcmp,buf和buf1是不相等的.\n");
return 0;
}
运行结果:
继续来个来个例子:
下面是网上找的一个(内存四区)图: