char str[] = "http://www.xxxxx.com";//str数组名是个标识符,代表数组,它str是代表字符串的首位置
char *p = str ;//指针是个变量 sizeof(p)=4 sizeof(str)=21 p储存的是字符串首位置的位置
b=a;是正确的
a=b;是错误的;
a++;编译错误
b++;是正确的;
指针 |
数组 |
保存数据的地址 |
保存数据 |
间接访问数据 |
直接访问 |
通常用于动态数据结构 |
通常用于存储固定数目数据类型相同的元素 |
相关操作malloc(),free()等 |
隐式分配和删除 |
同常指向匿名数据 |
自身即为数据名 |
柔性数组:
#include <stdio.h>
#include <string.h>
#include <malloc.h>
'''
when your construct_data can't comfirm it's space,you can use zero space Of array :such as data[] or data[0]
'''
typedef struct MyData{
int nLen;
char data[];
}MyData;
void main(){
int nLen = 20;
char str[10] = "1234553232";
MyData *mydata = (MyData *)malloc(sizeof(MyData)+10*sizeof(char));
memcpy(mydata->data,str,10);
mydata->nLen=nLen;
printf("sizeof(MyData):%ld,mydata->data:%s",sizeof(MyData),mydata->data);
free(mydata);
}
这个可以灵活的定义MyData中的数组空间;
也可以利用指针实现相同效果,但是要单独施放空间,并且多了一个指针空间:
#include <stdio.h>
#include <string.h>
#include <malloc.h>
/*
when your construct_data can't comfirm it's space,you can use zero space Of array :such as
*/
typedef struct MyData{
int nLen;
char *p;//指针的方式 有个缺点那就是要单独释放空间
char data[];
}MyData;
void main(){
int nLen = 20;
char str[10] = "1234553232";
MyData *mydata = (MyData *)malloc(sizeof(MyData)+10*sizeof(char));
mydata->p=(char *)malloc(sizeof(int)*10);
char p[10]="abcdefj";
memcpy(mydata->p,p,10);
memcpy(mydata->data,str,10);
mydata->nLen=nLen;
printf("sizeof(MyData):%ld,mydata->p:%s,mydata->data:%s",sizeof(MyData),mydata->p,mydata->data);
free(mydata->p);
free(mydata);
}