c语言入门-代码

最近学习了C语言相关的东西,在这里记录下.

指针变量:  (代表某个变量在内存中的地址)

int *p;

float *p;

怎么取一个变量的地址, 使用取地址运算符  &:

//describe pointer

int a = 11, *pa = &a;

float b = 12, *pb = &b;

printf(“%d,%d,%f,%f\n”, a, *pa, b, *pb);

printf(“%d\n”, pb);

这里pb是地址, *pb是变量内容


内存分配:

char \*p = NULL;

p = (char \*)malloc(1);

if (p == NULL) {

//can't malloc

}

free(p);

~~~~~~~~~~

数组的指针:

int a[] = {1,2,3},\*p;

p = a;

p =&a[0];   //
这两种方式是等价的 
这是因为数组名本身就是一个常量指针 所以不需要用取地址符号&

// 
也就是说 这里 p+1 a+1 &a[1] 
都是取的数组 第一个元素的地址

// 那么取元素就是: printf("arrayspointer %d, %d,%d \n", \*(arr + 1), \*(p+1),\*(&arr[1] ));

//array's pointer

int
arr[] =
{ 1,
2, 3,
4 };

int \*p = arr, \*p2 = &arr[0];
// they are the same

for (int i = 0; i <
sizeof(arr)/4; i++) {

printf("val=%d,loc=%d,p2val=%d\n", \*p, p,\*p2);

p++;

p2++;

}

二维数组的指针

int a[2][3],

int(*p)[3] =a;   *(p+1) -> a[1]    a[1][1] 的地址 : *(p+1)  + 1 , 内容就是 *(*(p+1) + 1)

~~~~~~~~~

数组的指针:

char chs5[] = “mydream”, *pc = chs5;

printf(“%s,%c”, pc, *(pc + 1));

==========

指针数组

char*p[4]  ->  4个指向字符串的指针

char **pp = NULL;

char *NUMS[3] = {

“123”, “4567”, “78910”

};

for (int i = 0; i < 3; i++) {

pp = NUMS + i;

printf(“%s\n”,*pp);

}

函数声明:

int max(int a, intb);

int main () {xxxx}

int max(int a, intb) {

   //…

}

// 使用指针做参数替换

结构体:

struct Date date1, date2;

date1.d = 1;

date1.m = 12;

date1.y = 2001;

struct Date *psDate = &date1;

printf(“year=%d,year=%d\n”, psDate->y, (*psDate).y);

源码:

# include <stdio.h>
# include <stdlib.h>

// function
int max(int a, int b);
void swap(int *p1, int *p2);

enum Week {MON =1, TUE, FRI, SAT, SUN};

struct Date {
	int y, m, d;
};
struct Song {
	char title[64];
	int li;
	struct Date published;
};

int main() {

	printf("hello");
	//getchar();
	int i = 0;
	int sum = 0;
	while (i < 100) {
		sum += i;
		i++;
	}
	printf("%d\n", sum);
	for (int i = 1; i <= 9; i++) {
		for (int j = 1; j <= i; j++) {
			printf("%d*%d=%d ", i, j , i*j);
		}
		printf("\n");
	}

	printf("\n");
	char chs[] = { 'a', 'b', 'c' };
	char chs2[] = "abc";
	printf("%d,%d\n", sizeof(chs), sizeof(chs2));

	// describe pointer
	int a = 11, *pa = &a;
	float b = 12, *pb = &b;
	printf("%d,%d,%f,%f\n", a, *pa, b, *pb);
	printf("%d\n", pb);
	
	// memory mgmt
	char *pchar = NULL;
	pchar = (char *)malloc(1);
	if (pchar == NULL) {
		return -1;
	}
	*pchar = 'a';
	printf("\nchar is %c\n", *pchar);
	free(pchar);
	
	// array's pointer
	int arr[] = { 1, 2, 3, 4 };
	int *p = arr, *p2 = &arr[0]; // they are the same
	for (int i = 0; i < sizeof(arr)/4; i++) {
		printf("val=%d,loc=%d,p2val=%d\n", *p, p, *p2);
		p++;
		p2++;
	}
	p = arr;
	printf("arrays pointer %d, %d,%d \n", *(arr + 1), *(p+1), *(&arr[1] ));

	// string's pointer
	char chs5[] = "mydream", *pc = chs5;
	printf("%s,%c\n", pc, *(pc + 1));

	// pointer's pointer
	char **pp = NULL;
	char *NUMS[3] = {
		"123", "4567", "78910"
	};
	
	for (int i = 0; i < 3; i++) {
		pp = NUMS + i;
		printf("%s\n", *pp);
	}

	printf("maxis:%d\n", max(2, 3));

	// use pointer to swap
	int *px1 = new int(12), *px2 = new int(13);
	printf("beforeswap=%d,%d\n", *px1, *px2);
	swap(px1, px2);
	printf("afterswap=%d,%d\n", *px1, *px2);
	
	int *paaa = px1, *pbbb = px2;
	printf("Aother test way beforeswap=%d,%d\n", *paaa, *pbbb);
	swap(paaa, pbbb);
	printf("afterswap=%d,%d\n", *paaa, *pbbb);

	int aaaa = 12, bbbb = 13, *paaa1 = &aaaa, *pbbb1 = &bbbb;
	printf("Aother way beforeswap=%d,%d\n", *paaa1, *pbbb1);
	swap(paaa1, pbbb1);
	printf("afterswap=%d,%d\n", *paaa1, *pbbb1);

	// struct
	struct Date date1, date2;
	date1.d = 1;
	date1.m = 12;
	date1.y = 2001;
	struct Date *psDate = &date1;
	printf("year=%d, year=%d\n", psDate->y, (*psDate).y);

	getchar();

}

void swap(int *p1, int *p2) {
	printf("p1=%d,*p1=%d,p2=%d,*p2=%d\n", p1, *p1, p2, *p2);
	int t = *p1;
	printf("temp=%d, whereis t = %d\n", t, &t);
	*p1 = *p2;
	*p2 = t;
	printf("p1=%d,*p1=%d,p2=%d,*p2=%d\n", p1, *p1, p2, *p2);
}

int max(int a, int b) {
	return a > b ? a : b;
}