数组与指针的恩怨
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");
}
?
?
?
?
總結
- 上一篇: 梦到过世的父亲代表什么
- 下一篇: 孕晚期梦到鱼什么预兆