如果定义二维数组:
T a[M][N];
- a[i](i是整数)是一个一维数组
- a[i]的类型是 T *
- sizeof(a[i]) = sizeof(T) * N
- a[i]指向的地址: 数组a的起始地址 + i×N×sizeof(T)
void Reverse(int * p,int size) { //颠倒一个数组
for(int i = 0;i < size/2; ++i) {
int tmp = p[i];
p[i] = p[size-1-i];
p[size-1-i] = tmp;
}
}
int a[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12}};
Reverse(a[1],4);
=> { {1,2,3,4},{8,7,6,5},{9,10,11,12}};
Reverse(a[1],6);
=> { {1,2,3,4},{10,9,5,6},{7,8,11,12}};
2.指向指针的指针
定义:
T ** p;
p是指向指针的指针,p指向的地方应该存放着一个类型为 T * 的指针
*p 的类型是 T *
#includeusing namespace std; int main() { int **pp; //指向int*类型指针的指针 int * p; int n = 1234; p = &n; // p指向n pp = & p; //pp指向p cout << *(*pp) << endl; // *pp是p, 所以*(*pp)就是n return 0; } => 1234
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pF8U5Qeu-1655218282842)(F:markdown图片源路径image-20220614215128148.png)]
3.指针和字符串- 字符串常量的类型就是 char *
- 字符数组名的类型也是 char *
#includeusing namespace std; int main() { char * p = "Please input your name:n"; cout << p ; // 若不用cout, printf(p) 亦可 char name[20]; char * pName = name; cin >> pName; cout << "Your name is " << pName; return 0; } ____________________ Please input your name: Jack↙ Your name is Jack
- 字符数组名的类型也是 char *,就是一个地址.
char name[20];
int n;
scanf("%d%s",&n, name);
cin >> n >> name;
4.字符串操作库函数
-
char * strchr(const char * str,int c);【string char】
寻找字符c在字符串str中第一次出现的位置。如果找到,就返回指向该位置的char*指针;如果str中不 包含字符c,则返回NULL。
-
char * strstr(const char * str, const char * subStr);【string substr】
寻找子串subStr在str中第一次出现的位置。如果找到,就返回指向该位置的指针;如果str不包含字符串subStr,则返回NULL。
-
int stricmp(const char * s1,const char * s2);【string ignore compare】
大小写无关的字符串比较。如果s1小于s2则返回负数;如果s1等于s2,返回0;s1大于s2,返回正数。不同编译器编译出来的程序,执行stricmp的结果就可能不同。
-
int strncmp(const char * s1,const char * s2,int n);【string number compare】
比较s1前n个字符组成的子串和s2前n个字符组成的子串的大小。若长度不足n,则取整个串作为子串。返回值和strcmp类似。
-
char * strncpy(char * dest, const char * src,int n);【string number copy】
拷贝src的前n个字符到dest。如果src长度大于或等于n,该函数不会自动往dest中写入‘ ’;若src长度不足n,则拷贝src的全部内容以及结尾的‘ ’到dest。
-
char * strtok(char * str, const char * delim);【string token 标记 delimiter:定界符,分隔符】
连续调用该函数若干次,可以做到:从str中逐个抽取出被字符串delim中的字符分隔开的若干个子串。
-
int atoi(char *s);【ascii to integer】
将字符串s里的内容转换成一个整型数返回。比如,如果字符串s的内容是“1234”,那么函数返回值就是1234。如果s格式不是一个整数,比如是"a12",那么返回0。
-
double atof(char *s);【ascii to floating point numbers】
将字符串s中的内容转换成实数返回。比如,"12.34"就会转换成12.34。如果s的格式不是一个实数 ,则返回0。
-
char *itoa(int value, char *string, int radix);【integer to ascii】
将整型值value以radix进制表示法写入 string:
char szValue[20]; itoa( 27,szValue,10); //使得szValue的内容变为 "27" itoa( 27,szValue,16); //使得szValue的内容变为"1b"
#include#include using namespace std; int main() { char s1[100] = "12345"; char s2[100] = "abcdefg"; char s3[100] = "ABCDE"; strncat(s1,s2,3); // s1 = "12345abc" cout << "1) " << s1 << endl; //输出 1) 12345abc strncpy(s1,s3,3); // s3的前三个字符拷贝到s1,s1="ABC45abc" cout << "2) " << s1 << endl; //输出 2) ABC45abc strncpy(s2,s3,6); // s2 = "ABCDE" cout << "3) " << s2 << endl; //输出 3) ABCDE cout << "4) " << strncmp(s1,s3,3) << endl; //比较s1和s3的前三个字符,比较结果是相等,输出 4) 0 char * p = strchr(s1,'B'); //在s1中查找 'B'第一次出现的位置 17 if( p ) // 等价于 if( p!= NULL) cout << "5) " << p - s1 <<"," << *p << endl; //输出 5) 1,B else cout << "5) Not Found" << endl; p = strstr( s1,"45a"); //在s1中查找字串 "45a"。s1="ABC45abc" if( p ) cout << "6) " << p - s1 << "," << p << endl; //输出 6) 3,45abc else cout << "6) Not Found" << endl; //以下演示strtok用法: cout << "strtok usage demo:" << endl; char str[] ="- This, a sample string, OK."; //下面要从str逐个抽取出被" ,.-"这几个字符分隔的字串 p = strtok (str," ,.-"); //请注意," ,.-"中的第一个字符是空格 while ( p != NULL) { //只要p不为NULL,就说明找到了一个子串 cout << p << endl; p = strtok(NULL, " ,.-"); //后续调用,第一个参数必须是NULL } return 0; }



