数组与指针的恩怨
1、数组的本质
(1)、一种构造类型,(2)、相同类型的连续分配内存,(3)、数组的大小为sizeof(type)*array_size(模子type[ ]大小),(4)、数组名为数组的第一个元素的首地址 (5)、有时候可以当作指针常量
2、数组的地址VS数组名
数组的地址为&a,数组名为a,两者的指针运算也不一样,像&a+1,与a+1 是不同的
3、指针的本质
(1)、是一个变量(2)、是占用一定的内存空间(3)、用于保存内存地址的值(4)、可以通过*(钥匙)取得内容 (5)参数传递,丢失长度信息(6)、const左数右指
4、数组VS指针
数组:声明编译器自动分配一片连续的内存空间,数组名为指针常量,
指针:声明时表示只分配容纳4个字节空间的地址,指针为变量
5、字符串:
字符数组、字符串(以\0结束的字符数组)、
char a[]="aaaaa";分布在栈空间
char *a="aaaaa";分布在只读存储区
strlen求取字符串长度
strcpy与 strncpy表示无限制与有限制,表示拷贝
strcat与strncat表示无限制与有限制,表示连接
#include <stdio.h>
//#include <syslib.h>
#include <string.h>
main()
{
char d[]="Golden Global"; // 可以运行 堆空间
//char *d ="Golden Global"; // 不可以运行 只读存储区
char *s=" View WinIDE Library";
//clrscr();
strncpy(d,s,3);
printf("%s",d);
}
6、数组指针与指针数组
数组指针:本质是指针,类型为数组类型
typedef int(INT)[len]; //表示定义一个数组类型(也就是定义了一个模子)
INT a; //定义一个变量
INT * p;// 表示定义一个数组指针
等价于int (*p)[len]
#include<stdio.h>
int main()
{
//数组指针
int a[3]={1,2,3};
int *p1=a;
typedef int(AINT)[3];
AINT *p2=&a;
int b[2][2]={{1,2},{3,4}};
typedef int(MATRIX)[2][2];
MATRIX *p3=&b;
int (*p4)[3]=&a;
//指针数组
char *c[10];
c[0]="zhao";
c[1]="chuang";
printf("%s\n",c[0]);
return 0;
}
指针数组:本质是数组,内容是字符串
char * aa[len]={"aa","aa","cc"}
#include <stdio.h>
#include <string.h>
int lookup_keyword(const char* key, const char* table[], const int size)
{
int ret = -1;
int i = 0;
for(i=0; i<size; i++)
{
if( strcmp(key, table[i]) == 0 )
{
ret = i;
break;
}
}
return ret;
}
#define DIM(a) (sizeof(a)/sizeof(*a)) //深刻理解*a代表32为的内存地址
int main()
{
const char* keyword[] = {
"do",
"for",
"if",
"register",
"return",
"switch",
"while",
"case",
"static"
};
printf("%d\t%d\n",sizeof(keyword),sizeof(*keyword));
//keyword数组存放32为地址4个字节,*keyword表示第一个元素的指针(地址)
printf("%s\n",*keyword);
printf("%d\n", lookup_keyword("return", keyword, DIM(keyword)));
printf("%d\n", lookup_keyword("main", keyword, DIM(keyword)));
}
7、main函数知道少
#include <stdio.h>
//argc 表示参数个数。argv表命令,env表示环境变量
int main(int argc, char* argv[], char* env[])
{
int i = 0;
printf("============== Begin argv ==============\n");
for(i=0; i<argc; i++)
{
printf("%s\n", argv[i]);
}
printf("============== End argv ==============\n");
printf("\n");
printf("\n");
printf("\n");
printf("============== Begin env ==============\n");
for(i=0; env[i]!=NULL; i++)
{
printf("%s\n", env[i]);
}
printf("============== End env ==============\n");
}