1.一維數組
#include <stdio.h>
//int a[10]; //未初始化的全局變量是0
int main()
{
#if 0
int a[10]; //定義有10個整型元素的數組,在內存裏面連續存儲
//int a[0]; //錯誤
int k;
//int b[k] = {0}; //數組的長度一定是確定的
#endif
//數組的初始化操作
//int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; //對所有元素初始化
//int a[10]; //沒有初始化,未初始化的局部變量是垃圾值
//int a[10] = {1, 2, 3}; //對部分元素初始化,沒有初始化的元素變成0
//int a[] = {1, 2, 3, 4, 5, 6 ,8, 8}; //可以不指定數組長度,但是一定要初始化
int a[10] = {0}; //所有元素初始化成0
//printf("%d\n", a); //不能直接輸出整型數組
int i;
for (i = 0; i < sizeof(a) / sizeof(int); i++)
{
printf("%d ", a[i]);
}
printf("\n");
printf("%p\n", &a[0]);
printf("%p\n", a); //a表示數組首元素地址,和&a[0]意義一樣
printf("%p\n", &a); //&a表示數組的地址
printf("*********\n");
printf("%p\n", &a[0] + 1);
printf("%p\n", a + 1);
printf("%p\n", &a + 1);
return 0;
}
2.二維數組
#include <stdio.h>
int main()
{
int i, j;
//int a[3][4]; //三行四列的二維數組
//int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; //對所有元素初始化
//int a[3][4] = {1, 2, 3, 4, 5}; //對部分元素初始化
//int a[][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
int a[3][4] = {0}; //整個數組初始化成0
for (i = 0; i < 3; i++) //行循環
{
for (j = 0; j < 4; j++) //列循環
{
printf("%d ", a[i][j]);
}
printf("\n"); //每行結束打印換行
}
printf("%p\n", &a[0][0]); //第一個元素的地址
printf("%p\n", a); //數組名
printf("%p\n", &a);
printf("%p\n", a[0]);
printf("%p\n", &a[0]);
printf("*************************\n");
printf("%p\n", &a[0][0] + 1); //第一個元素的地址,單位是一個元素,四個字節
printf("%p\n", a + 1); //數組名,數組首行地址,單位是一行
printf("%p\n", &a + 1); //數組的地址,單位是一個數組
printf("%p\n", a[0] + 1); //數組首行首元素地址,單位是一個元素
printf("%p\n", &a[0] + 1); //數組首行地址
/*
&a 數組地址
*(&a) 數組首行地址
a 數組首行地址
*a 數組首行元素地址
*/
return 0;
}
3.字符數組
#include <stdio.h>
int main()
{
int i;
//char a[10] = {'h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd'};
char b[15] = "helloworld";
/*char c[15];
c = "helloworld";*/
/*for (i = 0; i < 10; i++)
{
printf("%c", a[i]);
}
printf("\n");*/
printf("%s\n", b); //遇到'\0'結束
return 0;
}
4.字符串處理函數
#include <stdio.h>
#include <string.h>
int main()
{
char a[32] = {0}; //初始化字符數組 char a[32] = {'\0'};
char b[32] = "hellwoorld";
char c[32] = "123451234512345";
/*char d[32]; //d是數組名 是數組首元素低地址 是常指針
d = "helloworld";
d[32] = "helloworld";*/
//strcpy(a, b); //字符串拷貝函數,把數組b中的字符串拷貝到數組a中
//strcpy(c, b); //包括'\0',所以是全部覆蓋
//strcpy(a, "helloworld");
//printf("%s\n", a);
//printf("%s\n", c);
//strcat(b, c); //字符串連接函數 把字符串c連接到字符串b後面
//strcat(b, "111111");
//strcat("11111", b); //錯誤
//printf("%s\n", b);
if (strcmp(b, c) > 0) //字符串比較函數 返回值 b>c 返回值大於0, b==c 返回值等於0 b<c 返回值小於0
{
printf("b > c\n");
}
if (strcmp(b, "helloworld") > 0)
{
printf("b > hello\n");
}
return 0;
}
5.自定義函數
#include <stdio.h>
void swap(int *x, int *y); //函數聲明,如果函數定義 在 函數調用 的下面
void print() //函數類型void 表示沒有返回值 沒有形參
{
printf("helloworld!\n"); //函數體
}
int add(int x, int y) //x和y 形參(形式參數) 實參和形參個數相同、類型相同、順序相同、名字可以不同
{ //2、給形參分配空間(棧空間) 3、傳參(值傳遞、地址傳遞)
//return x + y;
int sum; //4、執行函數體
sum = x + y;
return sum; //返回結果 //5、返回
} //6、釋放空間(棧空間)!!!!!
int main()
{
int a = 1, b = 2;
int result;
print(); //1、通過函數名找到函數入口地址
result = add(a, b); //a和b 實參(實際參數) 實參不要加類型
printf("%d\n", result);
printf("%d\n", add(a, b));
printf("%p\n", add); //函數名也是地址
swap(&a, &b); //當涉及修改實參值得時候,需要傳地址
printf("a = %d b = %d\n", a, b);
return 0;
}
void swap(int *x, int *y)
{
int tmp = *x;
*x = *y;
*y = tmp;
}
6.宏函數
#include <stdio.h>
#define OUT printf("helloworld\n") //無參宏函數
#define P(s) printf("%s\n", s) //有參宏函數
#define SQR(x) (x) * (x) //宏函數只是簡單的替換,注意優先級
/*
宏函數的優點:
1、節省空間(不需要給形參分配空間)
2、執行效率高(不需要根據地址找到函數的入口)
宏函數的缺點:
1、編譯效率低(第一步預處理需要替換)
2、不安全,只是簡單的替換,沒有語法檢查
*/
int main()
{
int a = 1, b = 2;
OUT;
P("12345");
printf("%d\n", SQR(a + b)); //1 + 2 * 1 + 2
return 0;
}