1. 字符指针
指针变量概念:
1. 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。
2. 指针的大小是固定的4/8个字节(32位平台/64位平台)。
3.指针是有类型,指针的类型决定了指针的+-整数的步长,指针解引用操作的时.候的权限。
int main() { char ch = 'w';//取字符变量的地址赋给pc,pc是字符指针变量 char* pc = &ch; char* p = "abcdef";//常量字符串,最好在前面加上const,意思不是把字符串的值赋值给p,"abcdef\0"是7个字符,指针变量4个字节,意思是把字符串首元素地址给p *p = 'w';//程序报错的原因在于"abcdef"是常量字符串不能更改 printf("%s\n", p);//不用*p的原因是,*p拿到是a,p是字符串的地址, return 0; }
取字符变量的地址赋给pc,pc是字符指针变量
"abcdef"常量字符串,最好在前面加上const,意思不是把字符串的值赋值给p,"abcdef\0"是7个字符,指针变量4个字节,意思是把字符串首元素地址给p
不用*p的原因是,*p拿到是a,p是字符串的地址,数组在内存中是连续存放的,只要拿到首字符地址,就会一直打印到'\0'
例题1
int main() { char str1[] = "hello bit."; char str2[] = "hello bit."; const char *str3 = "hello bit."; const char *str4 = "hello bit."; if(str1 ==str2) printf("str1 and str2 are same\n"); else printf("str1 and str2 are not same\n"); if(str3 ==str4) printf("str3 and str4 are same\n"); else printf("str3 and str4 are not same\n"); return 0; }
2. 指针数组
指针和数组
1.指针和数组是不同的对象,指针是一种变量,存放地址的,大小是4/8字节的,数组是一组相同类型元素的集合,是可以放多个元素的,大小是取决于元素个数和元素类型的
2.数组的数组名是数组首元素的地址,地址是可以放在指针变量中,可以通过指针访问数组,数组是一段连续的空间,所以返回首元素地址,后面就紧跟着的是后序元素
通过指针遍历数组
#include<stdio.h> int main() { int arr[10] = { 0 }; int* p = arr; int i = 0; int sz = sizeof(arr) / sizeof(arr[0]); //赋值 for (i = 0; i < sz; i++) { *p = i + 1;//*p++=i+1,*优先级高于++ p++; } p = arr; //打印 for (i = 0; i < sz; i++) { printf("%d ", *p);//*p++ p++; } return 0; }
*p++=i+1,++优先级高于*,先使用了后置++再执行*,但是后置++执行后的效果体现不出来,要到下一条语句才可以显现出作用,(先使用再++),
*p=i+1,p++<==>*p++=i+1
另一种写法
int main() { int arr[10] = { 0 }; int* p = arr; int i = 0; int sz = sizeof(arr) / sizeof(arr[0]); //赋值 for (i = 0; i < sz; i++) { *(p + i) = i + 1; } //打印 for (i = 0; i < sz; i++) { printf("%d ", *(p + i)); } }
[] 是个操作符
i和arr是[]这个操作符的操作数而已,*(arr + i) == *(i + arr) == i[arr];结果都是一样的,但是不建议写成i[arr]
类比于a + b == b + a;
两种写法的结果是一样的
指针数组概念
指针数组是数组,指针数组是存放指针的数组
类比于字符数组是存放字符的数组,char arr[5]
整型数组是存放整型的数组 int arr[10]
int main() { int a = 10; int b = 20; int c = 30; int d = 40; int e = 50; int* arr[5] = { &a,&b,&c,&d,&e }; int i = 0; for (i = 0; i < 5; i++) { printf("%d ", *(arr[i])); } return 0; }
abcde五个变量不一定连续,把它们的首元素地址放在arr数组里面,数组在内存中是连续存放的
整型指针数组
使用一维数组,模拟一个二维数组
#include<stdio.h> int main() { int a[] = { 1,2,3,4 }; int b[] = { 2,3,4,5 }; int c[] = { 3,4,5,6 }; int* arr[3] = { a,b,c }; int i = 0; for (i = 0; i < 3; i++) { int j = 0; for (j = 0; j < 4; j++) { printf("%d ", arr[i][j]); } printf("\n"); } return 0; }
arr[i][j]可写成*(arr[i]+j),一个整型指针(地址)加j向后偏移j个元素
用一个数组名表示首元素地址,把a,b,c放到arr中说明是把首元素地址存进去了,因为是个整型地址,所以是个整型指针,所以是int*arr[3]每个元素的类型是int*,本质是用一个指针数组,来管理3个一维数组
字符指针数组
int main() { const char* arr[4] = { "abcdef","qwer","hello world","hehe" }; int i = 0; for (i = 0; i < 4; i++) { printf("%s\n", arr[i]); } return 0; }
加const的原因是常量字符串的每个字符串产生的首字符地址,都是以常量字符串的起始地址