#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include "string.h"
#include <Windows.h>
struct Student {
char * name;
//char name[20];
int age;
};
////////////////////////////结构体定义和初始化//////////////////////////////
int main()
{
struct Student stu2 = { "test", 39 };
strcpy(stu2.name, "liujun");
printf("%s, %d \n", stu2.name, stu2.age);
system("pause");
return 0;
}
大家注意下这段代码中标红和标蓝的地方:
如果我把结构体中 char name[20];给注释掉,把 char * name; 给放开,程序会报错
报错位置是 strcpy(stu2.name, "liujun");
反之能正常运行,请问下
char * name;
//char name[20];
这两种写法,在这里有什么不一样吗?
charname[20];你可以简单的理解成先申请了一个指针name,然后给name分配了20个char大小的空间(不能再去更改空间的大小)。
而char*name;只是申请了一个指针name,还没有给name分配空间(你可以多次给name分配不同大小的空间,分配新的空间前记得释放原来的空间)
谢谢,明白了数组是一段连续的内存地址,有固定的长度,&array[0]+offset可以用指针的方式读写。
指针是指向内存地址的量。
有点忘了哈哈。
问题出在调换名字的时候。到什么山,唱什么歌。指针和数组好比两座“山”,两种“定义环境”。
1。如果采用指针定义构造体Student的姓名项数据,那在更换姓名时,就要用关联新名字的指针来代替。
#include<stdio.h>#include"string.h"structStudent{char*name;intage;};intmain(){structStudentstu2={"test",39};//字符型指针pname指向字符串"liujun"的第一个字符'j'char*pname="liujun";//用字符型指针pname代替构造体stu2的name项指针stu2.name=pname;printf("%s,%d\n",stu2.name,stu2.age);return0;}
2。如果采用字符数组来定义构造体Student的姓名项数据,那在变更名字时,就要用到“复制字符串”的函数。
#include<stdio.h>#include"string.h"structStudent{charname[20];intage;};intmain(){structStudentstu2={"test",39};strcpy(stu2.name,"liujun");printf("%s,%d\n",stu2.name,stu2.age);return0;}
注意 ,字符串有结束字符 ‘\0’.用指针指向一个字符串,打印时会是一个完整的字符串。如果字符串中的字符,用字符数组来存储,完成储存后 没有放置字符串的结束字符‘\0’.,那么,%s格式会继续输出剩下的无关字符(垃圾)。
#include<stdio.h>intmain(){/*字符串输出完成后,可能出现"垃圾",*因为没有放置'\0'*/charar[5];ar[0]='H';ar[1]='e';ar[2]='l';ar[3]='l';ar[4]='0';printf("ar数据:%s\n",ar);/*输出数据后,不会有垃圾。*因为这个字符数组cp,*是用字符串来初始化的。*/charcp[]="Hello";printf("cp数据:%s\n",cp);/*没有垃圾,因为这个字符型指针,*是用一个字符串初始化的。*/char*p="OSChina";printf("cp数据:%s\n",p);return0;}
输出(这种垃圾,用复制、粘贴,可能会“过滤掉”,所以用影像文档):
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。