c语言入门-代码

来源:互联网 发布:素描入门书籍推荐 知乎 编辑:程序博客网 时间:2024/06/09 20:29

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

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

int *p;

float *p;

 

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

//describe pointer

inta =11, *pa= &a;

floatb =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

intarr[] ={ 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)

 

~~~~~~~~~

数组的指针:

charchs5[] = "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 Datedate1, 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>// functionint 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 pointerint a = 11, *pa = &a;float b = 12, *pb = &b;printf("%d,%d,%f,%f\n", a, *pa, b, *pb);printf("%d\n", pb);// memory mgmtchar *pchar = NULL;pchar = (char *)malloc(1);if (pchar == NULL) {return -1;}*pchar = 'a';printf("\nchar is %c\n", *pchar);free(pchar);// array's pointerint arr[] = { 1, 2, 3, 4 };int *p = arr, *p2 = &arr[0]; // they are the samefor (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 pointerchar chs5[] = "mydream", *pc = chs5;printf("%s,%c\n", pc, *(pc + 1));// pointer's pointerchar **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 swapint *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);// structstruct 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;}



0 0