提起毕设,总是觉得很痛苦,这个技术不太愿意去搞,一方面兴趣不大,另一方面和我以后的工作基本没有关系,但是又没有办法,硬着头皮看了点文章,却无法思考。
不过一切都是借口,都是为自己的不坚定和懒惰开脱,明知道自己可以做下去,而且曾经这样做过,却还是在找借口往后推。
该是刹车的时候了,放开其他的过虑和担忧,一心扑在当下
- 毕设首当其冲 重要紧急
- 累了的时候,看看技术书籍 重要
- 与人交流,锻炼身体 培养习惯
#include
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
const char ca[] = {'h', 'e', 'l', 'l', 'o'};
cout << strlen(ca) << endl;
int i = 0;
while (ca[i] != '\0') {
cout << ca[i++] << endl;
}
cout << strlen(ca) << endl;
}
windows xp下的mingw 结果当时我非常纳闷怎么ca的长度会变化了(5,6),试了几次结果都是这样,没有想明白,于是换到了linux下同样的程序,结果如下
D:\c_c_plus>a.exe
5
h
e
l
l
o
6
sulong@sulong-desktop:~/Documents/c_c_plus$ ./a.out这里,ca的长度再次变化了(5,8),我的第一反应是在此好像strlen对ca不起作用了,仔细看书,归结出原因在此:
8
h
e
l
l
o
6
#include不过有一点不是很明白,对于第一个程序,为什么对ca进行解引用之后,ca的长度变化了?windows(5,6),linux(8,6),我的猜测是c++允许计算数组的超出末端的地址,但是不允许对此地址进行解引用操作,否则结果是未定义的。
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
const char ca[] = {'h', 'e', 'l', 'l', 'o', '\0'};
cout << strlen(ca) << endl;
int i = 0;
while (ca[i] != '\0') {
cout << ca[i++] << endl;
}
cout << strlen(ca) << endl;
}
output:
5
h
e
l
l
o
5
#include
#include
using namespace std;
int main(int argc, char* argv[])
{
const char *c1 = "hello";
const char *c2 = "world";
char pc[5 + 5 + 1];
strncpy(pc, c1, 5);
cout << pc << endl;
}
output:
hello6
#include#include #include using namespace std; int main(int argc, char *argv[]) { const char ca[] = {'h', 'e', 'l', 'l', 'o'}; cout << strlen(ca) << endl; int i = 0; while (ca[i] != '\0') { cout << ca[i++] << endl; } cout << strlen(ca) << endl; }
windows xp下的mingw 结果 D:\c_c_plus>a.exe 5 h e l l o 6当时我非常纳闷怎么ca的长度会变化了(5,6),试了几次结果都是这样,没有想明白,于是换到了linux下同样的程序,结果如下
sulong@sulong-desktop:~/Documents/c_c_plus$ ./a.out 8 h e l l o 6这里,ca的长度再次变化了(5,8),我的第一反应是在此好像strlen对ca不起作用了,仔细看书,归结出原因在此:
#include不过有一点不是很明白,对于第一个程序,为什么对ca进行解引用之后,ca的长度变化了?windows(5,6),linux(8,6),我的猜测是c++允许计算数组的超出末端的地址,但是不允许对此地址进行解引用操作,否则结果是未定义的。#include #include using namespace std; int main(int argc, char *argv[]) { const char ca[] = {'h', 'e', 'l', 'l', 'o', '\0'}; cout << strlen(ca) << endl; int i = 0; while (ca[i] != '\0') { cout << ca[i++] << endl; } cout << strlen(ca) << endl; } output: 5 h e l l o 5
#include#include using namespace std; int main(int argc, char* argv[]) { const char *c1 = "hello"; const char *c2 = "world"; char pc[5 + 5 + 1]; strncpy(pc, c1, 5); cout << pc << endl; } output: hello6
A 声明从它的名字开始读取,然后按照优先级顺序依次读取;举例说明:char * const * (*next)();
B 优先级从高到低依次是:
B.1 声明中被括号括起来的那部分;
B.2 后缀操作符:括号()表示这是一个函数,而方括号[]表示这是一个数组;
B.3 前缀操作符:星号*标识“指向……的指针”;
C 如果const和(或者)volatile关键字的后面紧跟类型说明符(如int,long等),那么它作用于类型说明符,在其他情况下,const和(或)volatile关键字作用于它左边紧邻的指针星号。
A next ——next为声明的名字故 char * const *(*next)();的含义就是: next是一个函数指针,这个函数返回一个指向字符类型的常量指针
B.1 (*next) ——next为一个指向……的指针
B.2 (*next)() ——next是一个函数指针
B.3 *(*next)() ——next是一个函数指针,这个函数返回一个指向……的指针
C char * const ——指向字符类型的常量指针
A 声明从它的名字开始读取,然后按照优先级顺序依次读取; B 优先级从高到低依次是: B.1 声明中被括号括起来的那部分; B.2 后缀操作符:括号()表示这是一个函数,而方括号[]表示这是一个数组; B.3 前缀操作符:星号*标识“指向……的指针”; C 如果const和(或者)volatile关键字的后面紧跟类型说明符(如int,long等),那么它作用于类型说明符,在其他情况下,const和(或)volatile关键字作用于它左边紧邻的指针星号。举例说明:char * const * (*next)();
A next ——next为声明的名字 B.1 (*next) ——next为一个指向……的指针 B.2 (*next)() ——next是一个函数指针 B.3 *(*next)() ——next是一个函数指针,这个函数返回一个指向……的指针 C char * const ——指向字符类型的常量指针故 char * const *(*next)();的含义就是: next是一个函数指针,这个函数返回一个指向字符类型的常量指针
#include会打印出结果helloworld,这个时候要注意,在下面例子中
int main(int agrc, char* argv[])
{
printf("hello"
"world \n");
}
char * a[] = {因为"two" 之后少了逗号","而变成了"one"和"twothree"组成的字符串数组
"one",
"two"
"three"
};
#include int main(int agrc, char* argv[]) { printf("hello" "world \n"); }会打印出结果helloworld,这个时候要注意,在下面例子中
char * a[] = { "one", "two" "three" };因为"two" 之后少了逗号","而变成了"one"和"twothree"组成的字符串数组