最近学习了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;
}