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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值